您的位置:首页 > 其它

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

2018-03-22 20:58 676 查看
这两天老大叫做个推送系统,捋了挺久的早上才捋清楚 。
推送技术方面我用的websocket  我这边先讲一下websocket 配置 和基本解析
在boot 项目的基本依赖上添加这个依赖 <!-- 添加websocket依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>然后创建一个处理类名字可以随便命名
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();
}

}

}
代码里面我注释都写的很清楚不清楚可以邮我
接下来我画一下我自己做的推送流的流程(我这边只将我主动推送的流程 被动的不说下次有时间我在贴出来)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  websoket