diff --git a/src/main/java/com/iflytop/gd/common/controller/NotificationWebsocketEndpoint.java b/src/main/java/com/iflytop/gd/common/controller/NotificationWebsocketEndpoint.java new file mode 100644 index 0000000..d09e3a1 --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/controller/NotificationWebsocketEndpoint.java @@ -0,0 +1,26 @@ +package com.iflytop.gd.common.controller; + +import com.iflytop.gd.infrastructure.modules.WebSocketNotificationMgrImpl; +import jakarta.annotation.Resource; +import jakarta.websocket.EndpointConfig; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; +import jakarta.websocket.server.ServerEndpoint; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@ServerEndpoint(value = "/api/v1/ws/notifications") +@Slf4j +@Component +public class NotificationWebsocketEndpoint { + + @Resource + private WebSocketNotificationMgrImpl notificationMgr; + + @OnOpen + public void onOpen(Session session, EndpointConfig endpointConfig) { + // 保存 session 到对象 + this.notificationMgr.addSession(session); + log.info("[websocket] 新的连接:id={}", session.getId()); + } +} diff --git a/src/main/java/com/iflytop/gd/common/notification/Notification.java b/src/main/java/com/iflytop/gd/common/notification/Notification.java new file mode 100644 index 0000000..baddb65 --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/notification/Notification.java @@ -0,0 +1,61 @@ +package com.iflytop.gd.common.notification; + +import cn.hutool.core.date.DateTime; +import lombok.Getter; + + +/** + * 向前台推送的消息类 + */ + +@Getter +public class Notification { + private final String level; + private final String content; + private final String dateTime = DateTime.now().toString("yyyy/MM/dd HH:mm:ss"); + + private Notification(String level, String content) { + this.level = level; + this.content = content; + } + + /** + * 创建Info级别通知 + * @param content 通知内容 + * @return 通知实例 + */ + public static Notification infoNotification(String content) { + return new Notification("info", content); + } + + + /** + * 创建Warn级别通知 + * @param content 通知内容 + * @return 通知实例 + */ + public static Notification warnNotification(String content) { + return new Notification("warn", content); + } + + /** + * 创建Error级别通知 + * @param content 通知内容 + * @return 通知实例 + */ + public static Notification errorNotification(String content) { + return new Notification("error", content); + } + + + /** + * 创建Fatal级别通知 + * @param content 通知内容 + * @return 通知实例 + */ + public static Notification fatalNotification(String content) { + return new Notification("fatal", content); + } + + +} diff --git a/src/main/java/com/iflytop/gd/infrastructure/modules/WebSocketNotificationMgrImpl.java b/src/main/java/com/iflytop/gd/infrastructure/modules/WebSocketNotificationMgrImpl.java new file mode 100644 index 0000000..bd097c4 --- /dev/null +++ b/src/main/java/com/iflytop/gd/infrastructure/modules/WebSocketNotificationMgrImpl.java @@ -0,0 +1,31 @@ +package com.iflytop.gd.infrastructure.modules; + +import cn.hutool.json.JSONUtil; +import com.iflytop.gd.common.notification.Notification; +import com.iflytop.gd.system.modules.NotificationMgr; +import org.springframework.stereotype.Component; +import jakarta.websocket.Session; + +import java.util.HashSet; +import java.util.Set; + +@Component +public class WebSocketNotificationMgrImpl implements NotificationMgr { + + private final Set sessions = new HashSet<>(); + + @Override + public void pushNotification(Notification notification) { + for (Session session : sessions) { + session.getAsyncRemote().sendText(JSONUtil.toJsonStr(notification)); + } + } + + /** + * 添加websocket session + * @param session + */ + public void addSession(Session session) { + sessions.add(session); + } +} diff --git a/src/main/java/com/iflytop/gd/system/modules/NotificationMgr.java b/src/main/java/com/iflytop/gd/system/modules/NotificationMgr.java new file mode 100644 index 0000000..036fb96 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/modules/NotificationMgr.java @@ -0,0 +1,7 @@ +package com.iflytop.gd.system.modules; + +import com.iflytop.gd.common.notification.Notification; + +public interface NotificationMgr { + void pushNotification(Notification notification); +} diff --git a/src/main/java/com/iflytop/gd/system/modules/package-info.java b/src/main/java/com/iflytop/gd/system/modules/package-info.java deleted file mode 100644 index e599da0..0000000 --- a/src/main/java/com/iflytop/gd/system/modules/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.iflytop.gd.system.modules; \ No newline at end of file