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

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

推送技术方面我用的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();
        }

    }

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

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



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值