基于websocket 页面消息推送系统(后台处理流程解析)

这两天老大叫做个推送系统,捋了挺久的早上才捋清楚 。

推送技术方面我用的websocket  我这边先讲一下websocket 配置 和基本解析

在boot 项目的基本依赖上添加这个依赖

	
		
			org.springframework.boot
			spring-boot-starter-websocket
		

然后创建一个处理类名字可以随便命名

 
  
package com.jn.srr.message.endpoint;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 消息推送类
 * @addPerson : hzb 2018-3-22
 */


/*
 *注解解释:
 * ServerEndpoint 类似requestMapping 的功能
 * OnOpen                   建立连接触发
 * OnMessage                建立连接再次交互触发
 * OnClose                  断开连接触发
 */
@ServerEndpoint("/webSocket/{userid}")
public class WebSocketServerEndpoint {
    private static Map<String, Session> ssrSessions = new ConcurrentHashMap<String, Session>();

    @OnOpen
    public void openSession(@PathParam("userid") String userid, Session session){
            //将回话保存并且保证线程安全 (这个地方考虑用redis 做保存)
            ssrSessions.put(userid,session);
            //通知通知当前会话 告知连接成功
            sendText(session,"用户: "+userid+"  连接成功");

    }

    /**
     * 这个方法是用于你已经建立了连接 前端二次以后的交互 调用的方法 这个根据大家的实际业务调用是业务
     * @param userid
     * @param session
     * @param message
     */
    @OnMessage
    public void onMessage(@PathParam("userid") String userid, Session session, String message) {
        //发送小消息调用

    }

    /**
     * 这个是用于断开连接后执行 的方法 也是根据实际业务进行调用
     * @param userid
     * @param session
     */
    @OnClose
    public void onClose(@PathParam("userid") String userid, Session session) {

        String sessionId = session.getId();

        //清除session

        //这边可以做当前那几位在线 统计
    }



    /**
     * 发送消息 (往前端推送消息的方法)
     * @param session
     * @param message
     * @addPerson : hzb 2018-3-22
     */
    private void sendText(Session session, String message) {

        /**
         *   sessoion  这边向前端推送有两个方法
         *   getAsyncRemote  异步方式
         *   getBasicRemote  同步方式
         *   我这边采用的是同步方式反应速度比较快 但是后期可能出现 等待线程情况
         *   getBasicRemote 我如果向多个连接推送的话 需要排队发送一个一个来的情况
         *   我测试的过程出现过 IllegalStateException 错误 这个后期量上来了在做决定是否修改
         */
        RemoteEndpoint.Basic basic = session.getBasicRemote();

        try {
            //sendText 发送消息
            basic.sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
代码里面我注释都写的很清楚不清楚可以邮我

接下来我画一下我自己做的推送流的流程(我这边只将我主动推送的流程 被动的不说下次有时间我在贴出来)

基于websocket 页面消息推送系统(后台处理流程解析)_第1张图片


你可能感兴趣的:(springboot)