websocket定时推送数据

示例代码

1、添加pom.xml依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId>
</dependency>

 2、创建websocket配置类

package com.success.socket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/*** WebSocket配置类*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

3、创建WebSokcet工具类 

package com.success.socket;import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.dataservice.models.common.ResultPO;
import com.success.service.HomePageService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.util.SpringUtils;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;@Component
@ServerEndpoint(value = "/ws/{userId}")
public class SocketServer {private final static Logger log = LoggerFactory.getLogger(SocketServer.class);//记录当前在线连接数private static final AtomicInteger onlineCount = new AtomicInteger(0);//存放所有在线的客户端	private static final ConcurrentHashMap<String, Session> clients = new ConcurrentHashMap<>();//注入homePageService ,实际的业务在这里实现private static HomePageService homePageService = SpringUtils.getApplicationContext().getBean(HomePageService.class);/*** 连接建立成功调用的方法* 连接成功返回 {"msg":"ok","event":"open"}*/@OnOpenpublic void onOpen(Session session, @PathParam("userId") String userId) {onlineCount.incrementAndGet(); // 在线数加1clients.put(session.getId(), session);JSONObject json = new JSONObject();json.put("event", "open");json.put("msg", "ok");this.sendMessage(json.toJSONString());log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());}/*** 连接关闭调用的方法*/@OnClosepublic void onClose(Session session) {onlineCount.decrementAndGet(); // 在线数减1clients.remove(session.getId());log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息 {"event":"getCountGeneral"}*                当业务改动数据时,可以主动发消息(不需要客户端主动请求)*/@OnMessagepublic void onMessage(String message, Session session) {log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);if (StringUtils.isBlank(message)) {JSONObject jsonRes = new JSONObject();jsonRes.put("msg", "event无法处理");this.sendMessage(jsonRes.toJSONString());}//解析发送的报文JSONObject jsonObject = JSON.parseObject(message);//24小时实时数据  前端发送{"event":"getCountGeneral"}if ("getCountGeneral".equals(jsonObject.getString("event"))) {this.sendMessage(getCountGeneral());}}@OnErrorpublic void onError(Session session, Throwable error) {log.error("链接发生错误:{},原因:{}", session.getId(), error.getMessage());error.printStackTrace();}/*** 获取24小时实时数据** @return*/public String getCountGeneral() {Map<String,Object> map = new HashMap<>();		//业务1map.put("interfaceCallTop",homePageService.getInterfaceCallTop(params));//业务2map.put("countGeneral",homePageService.getCountGeneral1());return JSONObject.toJSONString(map);}/*** 群发消息** @param message 消息内容*/public void sendMessage(String message) {if (clients.isEmpty()) {log.info("*********  当前无客户端链接  *********");}for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {Session toSession = sessionEntry.getValue();toSession.getAsyncRemote().sendText(message);log.info("服务端发送消息给客户端:{}", toSession.getId());}}/*** 启动群发任务,用于定时任务*/public void run() {//首页24小时实时数据 当日接口访问排行 当日单位调用排行 当日应用调用排行this.sendMessage(getCountGeneral());}
}

4、定时任务

有时候需要后端定时推送数据给前端,需要增加以下代码:

package com.success.utils;import com.success.socket.SocketServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@Component
@RestController
public class DataPushScheduledTask {private final static Logger log = LoggerFactory.getLogger(DataPushScheduledTask.class);/*** 30秒一次* 定时场景数据推送*/@Scheduled(cron = "0/30 * * * * ? ")@GetMapping("/test")public void executeDataPush() {log.info("*********   定时任务执行   *********");new SocketServer().run();log.info("*********   定时任务完成   *********");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社交创新的标杆:解读Facebook的社交模式

引言 在当今数字化时代&#xff0c;社交媒体已成为人们日常生活和沟通的重要工具。作为全球最大的社交媒体平台&#xff0c;Facebook不仅改变了我们的社交模式&#xff0c;而且对全球的社交文化、商业活动和公共事务产生了深远的影响。本文将深入探讨Facebook的社交模式&#…

C++算法题 - 矩阵

目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

yolo组件之BottleneckCSP总结

1. 功能解释 Bottleneck CSP&#xff08;Cross Stage Partial&#xff09;是一种常用于计算机视觉任务的卷积神经网络&#xff08;CNN&#xff09;中的瓶颈层类型。它是传统瓶颈层&#xff08;如ResNet中常见的Bottleneck&#xff0c;关于Bottleneck介绍请参考文章yolo组件之Bo…

优斯特:防静电包装解决方案的巧妙运用

在现代电子产品生产与运输领域&#xff0c;防静电包装已成为保障产品安全的必备环节。优斯特凭借其创新的防静电包装解决方案&#xff0c;为客户提供了一种巧妙的方式来确保产品在存储和运输过程中不受静电影响&#xff0c;并且不会被刮花或损坏。 静电对产品的影响 静电对电子…

JAVA_类和对象(1)

认识面向对象 Java是一门纯面向对象的语言(Object Oriented Program, OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。  面向过程和面相对象并不是一门语言&#xff0c;而是解决…

【项目实战】记录一次PG数据库迁移至GaussDB测试(上)

目录 一、说明 1.1、参考文档 1.2、注意事项 1.3、环境基本情况 二、GaussDB新环境安装 2.1 配置操作环境变量 2.1.1 关闭防火墙 步骤1 执行以下命令&#xff0c;检查防火墙是否关闭。 步骤2 执行以下命令&#xff0c;关闭防火墙并禁止开机启动。 步骤3 修改/etc/sel…

Adobe AE(After Effects)2024下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

记录Python链接mysql数据的增删改查方法

一、添加方法 db pymysql.connect(hostlocalhost,userroot,password123456,dbpython) cursor db.cursor() sql """insert into EMPLOYEEVALUES(3,张,天爱,35,F,8000) """ try:cursor.execute(sql)db.commit() #提交后&#xff0c;数据才会变 …

Chrome将网页保存为PDF的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

欧盟CE认证GPSD指令是什么?符合GPSD指令的产品都有哪些呢?

GPSD指General Product Safety Directive,译为通用产品安全指令。 2006年7月22日欧盟委员会发布第2001/95/EC标准法规GPSD指令的标准清单&#xff0c;由欧洲标准化组织按欧盟委员会指示制定的。 GPSD对产品安全的概念进行了定义&#xff0c;并规定了产品的通用安全要求、符合…

错误分析 (Machine Learning研习十九)

错误分析 您将探索数据准备选项&#xff0c;尝试多个模型&#xff0c;筛选出最佳模型&#xff0c;使用 Grid SearchCV微调其超参数&#xff0c;并尽可能实现自动化。在此&#xff0c;我们假设您已经找到了一个有前途的模型&#xff0c;并希望找到改进它的方法。其中一种方法就…

使用VLC无法播放安防监控EasyCVR平台分发出的FLV视频流,是什么原因?

安防视频汇聚平台EasyCVR不仅可支持的接入协议非常多&#xff08;包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等&#xff09;&#xff0…