当前位置:   article > 正文

webSocket+定时任务--->实现前后端交互,定时刷新前端列表页面_websocket 添加定时器

websocket 添加定时器

后端代码

1.加入依赖

  1. <!--webSocket-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-websocket</artifactId>
  5. </dependency>

2.在config包中添加定时任务的封装包

  1. package com.cloud.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.scheduling.TaskScheduler;
  5. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
  6. import org.springframework.web.socket.server.standard.ServerEndpointExporter;
  7. @Configuration
  8. public class ScheduledConfig {
  9. @Bean
  10. public ServerEndpointExporter serverEndpointExporter() {
  11. return new ServerEndpointExporter();
  12. }
  13. @Bean
  14. public TaskScheduler taskScheduler() {
  15. ThreadPoolTaskScheduler scheduling = new ThreadPoolTaskScheduler();
  16. scheduling.setPoolSize(10);
  17. scheduling.initialize();
  18. return scheduling;
  19. }
  20. }

3.新建webSocket文件夹,添加WebSocket服务

  1. package com.cloud.webSocket;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.stereotype.Component;
  4. import javax.websocket.*;
  5. import javax.websocket.server.ServerEndpoint;
  6. import java.io.IOException;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import java.util.concurrent.ConcurrentHashMap;
  10. /**
  11. * @program: webSocketTest
  12. * @description: WebSocket服务
  13. * @author: QE
  14. * @create: 2024-04-09
  15. **/
  16. @Component
  17. @Slf4j
  18. @ServerEndpoint("/websocket") //暴露的ws应用的路径
  19. public class WebSocket {
  20. // 用来存储服务连接对象
  21. private static Map<String ,Session> clientMap = new ConcurrentHashMap<>();
  22. /**
  23. * 客户端与服务端连接成功
  24. * @param session
  25. */
  26. @OnOpen
  27. public void onOpen(Session session){
  28. /*
  29. do something for onOpen
  30. 与当前客户端连接成功时
  31. */
  32. clientMap.put(session.getId(),session);
  33. }
  34. /**
  35. * 客户端与服务端连接关闭
  36. * @param session
  37. */
  38. @OnClose
  39. public void onClose(Session session){
  40. /*
  41. do something for onClose
  42. 与当前客户端连接关闭时
  43. */
  44. clientMap.remove(session.getId());
  45. }
  46. /**
  47. * 客户端与服务端连接异常
  48. * @param error
  49. * @param session
  50. */
  51. @OnError
  52. public void onError(Throwable error,Session session) {
  53. error.printStackTrace();
  54. }
  55. /**
  56. * 客户端向服务端发送消息
  57. * @param message
  58. * @throws IOException
  59. */
  60. @OnMessage
  61. public void onMsg(Session session,String message) throws IOException {
  62. /*
  63. do something for onMessage
  64. 收到来自当前客户端的消息时
  65. */
  66. sendAllMessage(message);
  67. }
  68. //向所有客户端发送消息(广播)
  69. public static void sendAllMessage(String message){
  70. Set<String> sessionIdSet = clientMap.keySet(); //获得Map的Key的集合
  71. // 此处相当于一个广播操作
  72. for (String sessionId : sessionIdSet) { //迭代Key集合
  73. Session session = clientMap.get(sessionId); //根据Key得到value
  74. session.getAsyncRemote().sendText(message); //发送消息给客户端
  75. }
  76. }
  77. }

4.写定时任务查询列表 定时刷新 (该代码刷新的是三张表,所以在定时任务中写了随机数循环方法,通过判断数字随机刷新不同的列表,如果只有一张表可以直接查询后就赋值)

  1. package com.cloud.webSocket;
  2. import cn.hutool.core.date.DateTime;
  3. import com.alibaba.fastjson.JSON;
  4. import com.cloud.domain.Gang;
  5. import com.cloud.domain.Hu;
  6. import com.cloud.domain.Shen;
  7. import com.cloud.service.GangService;
  8. import com.cloud.service.HuService;
  9. import com.cloud.service.ShenService;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.scheduling.annotation.Scheduled;
  12. import org.springframework.stereotype.Component;
  13. import java.util.*;
  14. @Component
  15. public class Task {
  16. @Autowired
  17. HuService huService;
  18. @Autowired
  19. ShenService shenService;
  20. @Autowired
  21. GangService gangService;
  22. @Scheduled(cron = "*/10 * * * * ?") //定时任务注解 十秒钟刷新一次
  23. public void send(){
  24. DateTime dateTime = new DateTime();
  25. System.err.println("本次刷新时间:"+dateTime);
  26. ArrayList<Integer> arrayList = new ArrayList<>();
  27. arrayList.add(1);
  28. arrayList.add(2);
  29. arrayList.add(3);
  30. Random random = new Random(); //创建一个Random对象,用于生成随机数
  31. int randomIndex = random.nextInt(arrayList.size()); //用Random对象生成一个介于 0 和arrayList.size()之间的随机整数,作为随机索引
  32. Integer randomElement = arrayList.get(randomIndex); //通过随机索引获取ArrayList中的对应元素,并将其存储在randomElement变量中。
  33. System.out.println("随机输出的数: " + randomElement);
  34. if (randomElement==1){
  35. List<Hu> list = huService.list();
  36. WebSocket.sendAllMessage(JSON.toJSONString(list)); //通过 WebSocket 连接发送消息。
  37. } else if (randomElement==2) {
  38. List<Gang> list = gangService.list();
  39. WebSocket.sendAllMessage(JSON.toJSONString(list));
  40. } else if (randomElement==3) {
  41. List<Shen> list = shenService.list();
  42. WebSocket.sendAllMessage(JSON.toJSONString(list));
  43. }
  44. }
  45. }

5. 启动类中加入定时任务注解  @EnableScheduling  就可以启动项目了

前端代码

1.添加websocket文件夹 在该文件夹下添加webSocket.js文件

  1. /**
  2. * 参数说明:
  3. * webSocketURL:String webSocket服务地址 eg: ws://127.0.0.1:8088/websocket (后端接口若为restful风格可以带参数)
  4. * callback:为带一个参数的回调函数
  5. * message:String 要传递的参数值(不是一个必要的参数)
  6. */
  7. export default{
  8. // 初始化webSocket
  9. webSocketInit(webSocketURL){ // ws://127.0.0.1:8088/websocket
  10. this.webSocket = new WebSocket(webSocketURL);
  11. this.webSocket.onopen = this.onOpenwellback;
  12. this.webSocket.onmessage = this.onMessageCallback;
  13. this.webSocket.onerror = this.onErrorCallback;
  14. this.webSocket.onclose = this.onCloseCallback;
  15. },
  16. // 自定义回调函数
  17. setOpenCallback(callback){ // 与服务端连接打开回调函数
  18. this.webSocket.onopen = callback;
  19. },
  20. setMessageCallback(callback){ // 与服务端发送消息回调函数
  21. this.webSocket.onmessage = callback;
  22. },
  23. setErrorCallback(callback){ // 与服务端连接异常回调函数
  24. this.webSocket.onerror = callback;
  25. },
  26. setCloseCallback(callback){ // 与服务端连接关闭回调函数
  27. this.webSocket.onclose = callback;
  28. },
  29. close(){ // 关闭连接
  30. this.webSocket.close();
  31. },
  32. sendMessage(message){ // 发送消息函数
  33. this.webSocket.send(message);
  34. },
  35. }

2.vue页面

下面的代码中 (import webSocket from "@/views/webSocket";) ---->这一行就是 1 中websocket文件夹的地址 

  1. <template>
  2. <div>
  3. <el-button type="primary" @click="sendMessage">发送消息</el-button>
  4. </div>
  5. </template>
  6. <script>
  7. import webSocket from "@/views/webSocket";
  8. export default {
  9. data() {
  10. return {
  11. tableData: [],
  12. }
  13. },
  14. methods: { },
  15. created() {
  16. // webSocket.webSocketInit(process.env.VUE_APP_BASE_API.replace("http","ws")+"/evgis/todoStatus")
  17. webSocket.webSocketInit('ws://127.0.0.1:8666/websocket') //初始化webSocket
  18. // 按需进行绑定回调函数
  19. webSocket.setOpenCallback(res => {
  20. console.log("连接建立成功", res);
  21. })
  22. webSocket.setMessageCallback(res => {
  23. // 在此处进行数据刷新操作即可实现数据发生改变时实时更新数据
  24. console.log(res)
  25. // 这行代码就是后端查询到的数据给前端列表赋值
  26. this.tableData = JSON.parse(res.data); //JSON.parse() 方法用于将 JSON 字符串转换为 JavaScript 对象
  27. console.log("接收到回信", res);
  28. })
  29. webSocket.setErrorCallback(res => {
  30. console.log("连接异常", res);
  31. })
  32. webSocket.setCloseCallback(res => {
  33. console.log("连接关闭", res);
  34. })
  35. }
  36. }
  37. </script>
  38. <style>
  39. </style>

   最后复制完代码记得将端口号改为自己的端口号, 查看路径是否一致,在写完后端代码后可以先测试一下webSocket是否可以连接成功 (在线websocket测试-在线工具-postjson

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号