diff --git a/casic-metering-common/pom.xml b/casic-metering-common/pom.xml index 142b343..9818581 100644 --- a/casic-metering-common/pom.xml +++ b/casic-metering-common/pom.xml @@ -185,6 +185,12 @@ org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + + + org.springframework.boot spring-boot-starter-data-redis diff --git a/casic-metering-common/pom.xml b/casic-metering-common/pom.xml index 142b343..9818581 100644 --- a/casic-metering-common/pom.xml +++ b/casic-metering-common/pom.xml @@ -185,6 +185,12 @@ org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + + + org.springframework.boot spring-boot-starter-data-redis diff --git a/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-metering-common/pom.xml b/casic-metering-common/pom.xml index 142b343..9818581 100644 --- a/casic-metering-common/pom.xml +++ b/casic-metering-common/pom.xml @@ -185,6 +185,12 @@ org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + + + org.springframework.boot spring-boot-starter-data-redis diff --git a/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java new file mode 100644 index 0000000..f61a7ff --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java @@ -0,0 +1,99 @@ +package com.casic.missiles.utils; + +import lombok.extern.slf4j.Slf4j; +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.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * @Description: Websocket ServerEndpoint + * @Author: wangpeng + * @Date: 2023/2/23 11:48 + */ +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap<>(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); +// System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("【websocket消息】连接断开,总数为:" + webSockets.size()); +// System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("【websocket消息】收到客户端消息:" + message); +// System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { + log.info("【websocket消息】广播消息:" + message); +// System.out.println("【websocket消息】广播消息:" + message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】广播消息发送异常"); + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message) { + log.info("【websocket消息】列表消息:" + message); +// System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】列表消息发送异常"); + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("【websocket消息】单点消息:" + message); +// System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】单点消息发送异常"); + e.printStackTrace(); + } + } + } + +} diff --git a/casic-metering-common/pom.xml b/casic-metering-common/pom.xml index 142b343..9818581 100644 --- a/casic-metering-common/pom.xml +++ b/casic-metering-common/pom.xml @@ -185,6 +185,12 @@ org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + + + org.springframework.boot spring-boot-starter-data-redis diff --git a/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java new file mode 100644 index 0000000..f61a7ff --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java @@ -0,0 +1,99 @@ +package com.casic.missiles.utils; + +import lombok.extern.slf4j.Slf4j; +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.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * @Description: Websocket ServerEndpoint + * @Author: wangpeng + * @Date: 2023/2/23 11:48 + */ +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap<>(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); +// System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("【websocket消息】连接断开,总数为:" + webSockets.size()); +// System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("【websocket消息】收到客户端消息:" + message); +// System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { + log.info("【websocket消息】广播消息:" + message); +// System.out.println("【websocket消息】广播消息:" + message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】广播消息发送异常"); + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message) { + log.info("【websocket消息】列表消息:" + message); +// System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】列表消息发送异常"); + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("【websocket消息】单点消息:" + message); +// System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】单点消息发送异常"); + e.printStackTrace(); + } + } + } + +} diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml index 627f8e5..707df30 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml @@ -5,12 +5,12 @@ - - - + + - + + @@ -21,7 +21,7 @@ - id, user_id, dept_id, message_type, business_id, business_code, message_topic, message_content, status, create_user, create_user_name, create_time, update_time + id, remind_id, remind_dept_id, business_id, business_code, message_type, message_title, message_content, status, create_user, create_user_name, create_time, update_time diff --git a/casic-metering-common/pom.xml b/casic-metering-common/pom.xml index 142b343..9818581 100644 --- a/casic-metering-common/pom.xml +++ b/casic-metering-common/pom.xml @@ -185,6 +185,12 @@ org.springframework.boot + spring-boot-starter-websocket + 2.4.5 + + + + org.springframework.boot spring-boot-starter-data-redis diff --git a/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java b/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java new file mode 100644 index 0000000..f61a7ff --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/utils/WebSocket.java @@ -0,0 +1,99 @@ +package com.casic.missiles.utils; + +import lombok.extern.slf4j.Slf4j; +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.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +/** + * @Description: Websocket ServerEndpoint + * @Author: wangpeng + * @Date: 2023/2/23 11:48 + */ +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap<>(); + + @OnOpen + public void onOpen(Session session, @PathParam(value = "userId") String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); +// System.out.println(userId + "【websocket消息】有新的连接,总数为:" + webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("【websocket消息】连接断开,总数为:" + webSockets.size()); +// System.out.println("【websocket消息】连接断开,总数为:" + webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("【websocket消息】收到客户端消息:" + message); +// System.out.println("【websocket消息】收到客户端消息:" + message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for (WebSocket webSocket : webSockets) { + log.info("【websocket消息】广播消息:" + message); +// System.out.println("【websocket消息】广播消息:" + message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】广播消息发送异常"); + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message) { + log.info("【websocket消息】列表消息:" + message); +// System.out.println("【websocket消息】列表消息:" + message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】列表消息发送异常"); + e.printStackTrace(); + } + } + } + } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("【websocket消息】单点消息:" + message); +// System.out.println("【websocket消息】单点消息:" + message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + log.error("【websocket消息】单点消息发送异常"); + e.printStackTrace(); + } + } + } + +} diff --git a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml index 627f8e5..707df30 100644 --- a/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/workbench/WorkbenchMessageMapper.xml @@ -5,12 +5,12 @@ - - - + + - + + @@ -21,7 +21,7 @@ - id, user_id, dept_id, message_type, business_id, business_code, message_topic, message_content, status, create_user, create_user_name, create_time, update_time + id, remind_id, remind_dept_id, business_id, business_code, message_type, message_title, message_content, status, create_user, create_user_name, create_time, update_time diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchMessage.java b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchMessage.java index 5626080..563ae8b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchMessage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/workbench/WorkbenchMessage.java @@ -27,20 +27,14 @@ /** * 消息提醒的用户id */ - @TableField("user_id") - private Long userId; + @TableField("remind_id") + private Long remindId; /** * 消息提醒的用户部门id */ - @TableField("dept_id") - private Long deptId; - - /** - * 消息提醒的业务类型 - */ - @TableField("message_type") - private String messageType; + @TableField("remind_dept_id") + private Long remindDeptId; /** * 消息提醒的业务表id @@ -55,10 +49,16 @@ private String businessCode; /** + * 消息提醒的业务类型 + */ + @TableField("message_type") + private String messageType; + + /** * 消息主题(冗余) */ - @TableField("message_topic") - private String messageTopic; + @TableField("message_title") + private String messageTitle; /** * 消息内容(消息提醒的业务内容名称)