From 8e742cd563bb9d97855fc0116223e3c20ad31686 Mon Sep 17 00:00:00 2001 From: xuxin <840198532@qq.com> Date: Mon, 1 Dec 2025 14:01:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=8D=E7=A9=B9=E5=A4=96=E5=8D=96--WebSocket?= =?UTF-8?q?-=E6=9C=8D=E5=8A=A1=E5=99=A8=E4=B8=8E=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E5=8F=8C=E5=90=91=E9=80=9A=E8=AE=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sky-server/pom.xml | 5 ++ .../sky/config/WebSocketConfiguration.java | 18 +++++ .../src/main/java/com/sky/task/OrderTask.java | 4 +- .../main/java/com/sky/task/WebSocketTask.java | 22 ++++++ .../com/sky/websocket/WebSocketServer.java | 71 +++++++++++++++++++ 5 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 sky-server/src/main/java/com/sky/config/WebSocketConfiguration.java create mode 100644 sky-server/src/main/java/com/sky/task/WebSocketTask.java create mode 100644 sky-server/src/main/java/com/sky/websocket/WebSocketServer.java diff --git a/sky-server/pom.xml b/sky-server/pom.xml index 565b5da..d5b6696 100644 --- a/sky-server/pom.xml +++ b/sky-server/pom.xml @@ -117,6 +117,11 @@ org.apache.poi poi-ooxml + + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/sky-server/src/main/java/com/sky/config/WebSocketConfiguration.java b/sky-server/src/main/java/com/sky/config/WebSocketConfiguration.java new file mode 100644 index 0000000..a46c2cb --- /dev/null +++ b/sky-server/src/main/java/com/sky/config/WebSocketConfiguration.java @@ -0,0 +1,18 @@ +package com.sky.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +/** + * WebSocket配置类,用于注册WebSocket的Bean + */ +@Configuration +public class WebSocketConfiguration { + + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} diff --git a/sky-server/src/main/java/com/sky/task/OrderTask.java b/sky-server/src/main/java/com/sky/task/OrderTask.java index 3c2e8d0..c765283 100644 --- a/sky-server/src/main/java/com/sky/task/OrderTask.java +++ b/sky-server/src/main/java/com/sky/task/OrderTask.java @@ -19,7 +19,7 @@ public class OrderTask { //处理订单超时未支付状态 // @Scheduled(cron = "0 * * * * ? ") - @Scheduled(cron = "0/5 * * * * ? ") +// @Scheduled(cron = "0/5 * * * * ? ") public void procesTimeOutOrder(){ log.info("定时任务自动执行,处理支付超时订单:"+ LocalDateTime.now()); //每分中查询一下订单,是否有超过15分(下单时间+15分钟 < 当前时间) @@ -42,7 +42,7 @@ public class OrderTask { //每日处理“派送中”的订单为已完成,每天凌晨1点执行一次 // @Scheduled(cron = "0 0 1 * * ? ") - @Scheduled(cron = "0/5 * * * * ? ") +// @Scheduled(cron = "0/5 * * * * ? ") public void processPsOrder(){ log.info("定时任务自动执行,处理派送中,未完成的订单:"+ LocalDateTime.now()); //每天上午1点查询一下,前一天是否有派送中,未完成的订单(下单时间< 当前时间 - 1小时) diff --git a/sky-server/src/main/java/com/sky/task/WebSocketTask.java b/sky-server/src/main/java/com/sky/task/WebSocketTask.java new file mode 100644 index 0000000..4d8223b --- /dev/null +++ b/sky-server/src/main/java/com/sky/task/WebSocketTask.java @@ -0,0 +1,22 @@ +package com.sky.task; + +import com.sky.websocket.WebSocketServer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Component +public class WebSocketTask { + @Autowired + private WebSocketServer webSocketServer; + + /** + * 通过WebSocket每隔5秒向客户端发送消息 + */ + @Scheduled(cron = "0/5 * * * * ?") + public void sendMessageToClient() { + webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now())); + } +} diff --git a/sky-server/src/main/java/com/sky/websocket/WebSocketServer.java b/sky-server/src/main/java/com/sky/websocket/WebSocketServer.java new file mode 100644 index 0000000..9a5fc83 --- /dev/null +++ b/sky-server/src/main/java/com/sky/websocket/WebSocketServer.java @@ -0,0 +1,71 @@ +package com.sky.websocket; + +import org.springframework.stereotype.Component; +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * WebSocket服务 + */ +@Component +@ServerEndpoint("/ws/{sid}") +public class WebSocketServer { + + //存放会话对象 + private static Map sessionMap = new HashMap(); + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session, @PathParam("sid") String sid) { + System.out.println("客户端:" + sid + "建立连接"); + sessionMap.put(sid, session); + } + + /** + * 收到客户端消息后调用的方法 + * + * @param message 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String message, @PathParam("sid") String sid) { + System.out.println("收到来自客户端:" + sid + "的信息:" + message); + } + + /** + * 连接关闭调用的方法 + * + * @param sid + */ + @OnClose + public void onClose(@PathParam("sid") String sid) { + System.out.println("连接断开:" + sid); + sessionMap.remove(sid); + } + + /** + * 群发 + * + * @param message + */ + public void sendToAllClient(String message) { + Collection sessions = sessionMap.values(); + for (Session session : sessions) { + try { + //服务器向客户端发送消息 + session.getBasicRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +}