【功能开发】SpringBoot WebSocket实现定时主动推送

public class MyWebSocket {

    //session为与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法
     *
     * @param session 可选的参数
     * @throws Exception
     */
    @OnOpen
    public void onOpen(Session session) throws Exception {
        this.session = session;
        System.out.println("Open");
    }

    /**
     * 连接关闭调用的方法
     *
     * @throws Exception
     */
    @OnClose
    public void onClose() throws Exception {
        wsMapStatus.put("default", 0);
        log.info("关闭客户" + "消息");
    }


    private static TaskWorkService taskWorkService;

    @Autowired
    public void setTaskWorkService(TaskWorkService taskWorkService) {
        MyWebSocket.taskWorkService = taskWorkService;
    }

    //存储各客户连接状态 重复访问和循环停止基于此判断 1连接中,0未连接
    public ConcurrentHashMap<String, Integer> wsMapStatus = new ConcurrentHashMap<>();
    //存储各客户请求体 定时自动请求从中获取
    public ConcurrentHashMap<String, QueryMissionControlDto> wsMapRequest = new ConcurrentHashMap<>();

    @OnMessage
    public void onMessage(String message) throws Exception {
        String defCustSerial="default";
        if (null != message) {
            QueryMissionControlDto dto = JSON.parseObject(message, QueryMissionControlDto.class);
            wsMapRequest.put(defCustSerial,dto);
            if (null == wsMapStatus.get(defCustSerial) || wsMapStatus.get(defCustSerial).equals(0)) {
                wsMapStatus.put(defCustSerial, 1);
                new Thread(() -> {
                    int i = 0;
                    while (true) {
                        try {
                            i++;
                            QueryMissionControlDto innerDto=wsMapRequest.get(defCustSerial);
                            String custSerial = innerDto.getCustSerial();
                            sendMessage(JSON.toJSONString(taskWorkService.queryMissionControl(innerDto)));
                            //sendMessage("客户:" + custSerial + " 累计发送" + i + "次");
                            log.info("客户:" + custSerial + " 累计发送" + i + "次");
                            //此处间隔时间与@Scheduled逻辑保持一直,完成后开始间隔
                            Thread.sleep(5000);
                            if (wsMapStatus.get(defCustSerial).equals(0)) {
                                break;
                            }

                        } catch (Exception e) {
                            log.error(e.toString());
                        }
                    }
                }).start();
            }else{
                String custSerial = dto.getCustSerial();
                sendMessage(JSON.toJSONString(taskWorkService.queryMissionControl(dto)));
                //sendMessage("客户:" + custSerial + " 累计发送" );
            }
            log.info("线程开启了");
        }
    }


    /**
     * 发生错误时调用
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开源的Java开发框架,它提供了许多对开发者友好的功能和工具。其中,Spring Boot还支持WebSocket,使得开发者能够轻松地实现消息推送功能。 在Spring Boot中使用WebSocket实现消息推送,需要以下几个步骤: 1. 添加WebSocket依赖:在项目的pom.xml文件中添加Spring Boot WebSocket依赖。 2. 创建WebSocket配置类:新建一个WebSocketConfig.java类,并在该类中添加@Configuration和@EnableWebSocket注解,以启用WebSocket。 3. 实现WebSocketHandle类:新建一个WebSocketHandler类,并继承TextWebSocketHandler类或实现WebSocketHandler接口,以处理WebSocket相关的请求和消息。在该类中,可以覆盖父类或接口的方法,如handleTextMessage()方法用于处理文本消息。 4. 添加WebSocket处理器:在WebSocketConfig.java类中,重写registerWebSocketHandlers()方法,并添加WebSocket处理器(即上一步创建的WebSocketHandler类)及对应的处理路径。 5. 前端页面:在前端页面中,使用WebSocket API与后端进行通信,并接收和处理后端发送的消息。 通过以上步骤,就完成了Spring Boot WebSocket的基本配置和实现。在实际使用中,可以根据具体需求,添加一些其他功能,如身份认证、消息广播、点对点消息等。 总结起来,Spring Boot通过提供WebSocket的支持,使得开发者能够方便地实现消息推送功能。通过简单的配置和编写处理器类,就可以实现与前端的实时通信。这样,开发者可以轻松地在项目中应用消息推送功能实现更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值