这两天老大叫做个推送系统,捋了挺久的早上才捋清楚 。
推送技术方面我用的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(); } } }
代码里面我注释都写的很清楚不清楚可以邮我
接下来我画一下我自己做的推送流的流程(我这边只将我主动推送的流程 被动的不说下次有时间我在贴出来)