From d36b61f3be361ff52b348250bc96b7320a34d469 Mon Sep 17 00:00:00 2001 From: liuhanqing <447067298@qq.com> Date: Tue, 26 Jan 2021 19:23:54 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90message=E3=80=91=20websocket=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kernel/message/api/WebsocketApi.java | 29 ++++++++++ .../message/api/pojo/MessageSendParam.java | 7 +++ .../controller/SysMessageController.java | 2 + .../message/db/MessageDbServiceImpl.java | 9 ++- .../message-sdk-websocket/pom.xml | 6 ++ .../websocket/WebSocketServiceImpl.java | 55 +++++++++++++++++++ .../websocket/server/WebSocketEndpoint.java | 2 +- .../service/impl/SysNoticeServiceImpl.java | 2 + 8 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/WebsocketApi.java create mode 100644 kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/WebSocketServiceImpl.java diff --git a/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/WebsocketApi.java b/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/WebsocketApi.java new file mode 100644 index 000000000..8d1342e15 --- /dev/null +++ b/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/WebsocketApi.java @@ -0,0 +1,29 @@ +package cn.stylefeng.roses.kernel.message.api; + +import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; +import cn.stylefeng.roses.kernel.message.api.enums.MessageReadFlagEnum; +import cn.stylefeng.roses.kernel.message.api.pojo.MessageParam; +import cn.stylefeng.roses.kernel.message.api.pojo.MessageResponse; +import cn.stylefeng.roses.kernel.message.api.pojo.MessageSendParam; + +import java.util.List; + +/** + * 系统消息websocket相关接口 + * + * @author liuhanqing + * @date 2021/1/26 18:14 + */ +public interface WebsocketApi { + + /** + * 发送websocket系统消息 + * + * @param userIdList userId 集合 + * @param messageSendParam 系统消息参数 + * @author liuhanqing + * @date 2021/1/26 18:17 + */ + void sendWebSocketMessage(List userIdList, MessageSendParam messageSendParam); + +} \ No newline at end of file diff --git a/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/pojo/MessageSendParam.java b/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/pojo/MessageSendParam.java index 77f971280..75c0fec03 100644 --- a/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/pojo/MessageSendParam.java +++ b/kernel-s-message/message-api/src/main/java/cn/stylefeng/roses/kernel/message/api/pojo/MessageSendParam.java @@ -1,11 +1,13 @@ package cn.stylefeng.roses.kernel.message.api.pojo; import cn.stylefeng.roses.kernel.rule.pojo.request.BaseRequest; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import lombok.EqualsAndHashCode; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.util.Date; /** * 发送系统消息的参数 @@ -56,4 +58,9 @@ public class MessageSendParam extends BaseRequest { @NotBlank(message = "业务类型不能为空", groups = {add.class, edit.class}) private String businessType; + /** + * 消息发送时间 + */ + private Date messageSendTime; + } diff --git a/kernel-s-message/message-business/src/main/java/cn/stylefeng/roses/kernel/message/modular/manage/controller/SysMessageController.java b/kernel-s-message/message-business/src/main/java/cn/stylefeng/roses/kernel/message/modular/manage/controller/SysMessageController.java index a56de2553..d63ec7c5e 100644 --- a/kernel-s-message/message-business/src/main/java/cn/stylefeng/roses/kernel/message/modular/manage/controller/SysMessageController.java +++ b/kernel-s-message/message-business/src/main/java/cn/stylefeng/roses/kernel/message/modular/manage/controller/SysMessageController.java @@ -15,6 +15,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -43,6 +44,7 @@ public class SysMessageController { */ @PostResource(name = "发送系统消息", path = "/sysMessage/sendMessage") public ResponseData sendMessage(@RequestBody @Validated(MessageSendParam.add.class) MessageSendParam messageSendParam) { + messageSendParam.setMessageSendTime(new Date()); messageApi.sendMessage(messageSendParam); return new SuccessResponseData(); } diff --git a/kernel-s-message/message-sdk-db/src/main/java/cn/stylefeng/roses/kernel/message/db/MessageDbServiceImpl.java b/kernel-s-message/message-sdk-db/src/main/java/cn/stylefeng/roses/kernel/message/db/MessageDbServiceImpl.java index a21c8da2d..d89ef0fc9 100644 --- a/kernel-s-message/message-sdk-db/src/main/java/cn/stylefeng/roses/kernel/message/db/MessageDbServiceImpl.java +++ b/kernel-s-message/message-sdk-db/src/main/java/cn/stylefeng/roses/kernel/message/db/MessageDbServiceImpl.java @@ -1,12 +1,14 @@ package cn.stylefeng.roses.kernel.message.db; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser; import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult; import cn.stylefeng.roses.kernel.message.api.MessageApi; +import cn.stylefeng.roses.kernel.message.api.WebsocketApi; import cn.stylefeng.roses.kernel.message.api.constants.MessageConstants; import cn.stylefeng.roses.kernel.message.api.enums.MessageReadFlagEnum; import cn.stylefeng.roses.kernel.message.api.exception.MessageException; @@ -39,6 +41,9 @@ import java.util.stream.Collectors; public class MessageDbServiceImpl implements MessageApi { + @Resource + private WebsocketApi websocketApi; + @Resource private UserServiceApi userServiceApi; @@ -57,7 +62,6 @@ public class MessageDbServiceImpl implements MessageApi { if (MessageConstants.RECEIVE_ALL_USER_FLAG.equals(receiveUserIds)) { // 查询所有用户 userIds = userServiceApi.queryAllUserIdList(new SysUserRequest()); - } else { String[] userIdArr = receiveUserIds.split(","); userIds = Convert.toList(Long.class, userIdArr); @@ -72,7 +76,6 @@ public class MessageDbServiceImpl implements MessageApi { // 初始化默认值 sysMessage.setReadFlag(MessageReadFlagEnum.UNREAD.getCode()); sysMessage.setSendUserId(loginUser.getUserId()); - sysMessage.setMessageSendTime(new Date()); userIdSet.forEach(userId -> { // 判断用户是否存在 if (userServiceApi.userExist(userId)) { @@ -80,6 +83,8 @@ public class MessageDbServiceImpl implements MessageApi { sendMsgList.add(sysMessage); } }); + + websocketApi.sendWebSocketMessage(ListUtil.toList(userIdSet), messageSendParam); sysMessageService.saveBatch(sendMsgList); } diff --git a/kernel-s-message/message-sdk-websocket/pom.xml b/kernel-s-message/message-sdk-websocket/pom.xml index 0bc7a8c83..f2763af14 100644 --- a/kernel-s-message/message-sdk-websocket/pom.xml +++ b/kernel-s-message/message-sdk-websocket/pom.xml @@ -29,6 +29,12 @@ org.springframework.boot spring-boot-starter-websocket + + cn.stylefeng.roses + auth-api + 1.0.0 + compile + diff --git a/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/WebSocketServiceImpl.java b/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/WebSocketServiceImpl.java new file mode 100644 index 000000000..c38527d75 --- /dev/null +++ b/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/WebSocketServiceImpl.java @@ -0,0 +1,55 @@ +package cn.stylefeng.roses.kernel.message.websocket; + +import cn.hutool.core.bean.BeanUtil; +import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; +import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser; +import cn.stylefeng.roses.kernel.message.api.WebsocketApi; +import cn.stylefeng.roses.kernel.message.api.enums.MessageReadFlagEnum; +import cn.stylefeng.roses.kernel.message.api.pojo.MessageResponse; +import cn.stylefeng.roses.kernel.message.api.pojo.MessageSendParam; +import cn.stylefeng.roses.kernel.message.websocket.manager.WebSocketManager; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 系统消息websocket + * + * @author liuhanqing + * @date 2021/1/2 22:00 + */ +@Slf4j +@Service +public class WebSocketServiceImpl implements WebsocketApi { + + + public final static ObjectMapper MAPPER; + + static { + MAPPER = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + + @Override + public void sendWebSocketMessage(List userIdList, MessageSendParam messageSendParam) { + // 获取当前登录人 + LoginUser loginUser = LoginContext.me().getLoginUser(); + try { + MessageResponse sysMessage = new MessageResponse(); + BeanUtil.copyProperties(messageSendParam, sysMessage); + sysMessage.setReadFlag(MessageReadFlagEnum.UNREAD.getCode()); + sysMessage.setSendUserId(loginUser.getUserId()); + String msgInfo = MAPPER.writeValueAsString(sysMessage); + + for (Long userId : userIdList) { + WebSocketManager.sendMessage(userId, msgInfo); + } + } catch (JsonProcessingException e) { + log.error("发送websocket异常", e); + } + } +} diff --git a/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/server/WebSocketEndpoint.java b/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/server/WebSocketEndpoint.java index 97fe3d064..b1009d942 100644 --- a/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/server/WebSocketEndpoint.java +++ b/kernel-s-message/message-sdk-websocket/src/main/java/cn/stylefeng/roses/kernel/message/websocket/server/WebSocketEndpoint.java @@ -33,7 +33,7 @@ public class WebSocketEndpoint { // 添加到链接管理 WebSocketManager.add(userId, session); // 返回消息 - session.getAsyncRemote().sendText("WebSocket连接成功"); +// session.getAsyncRemote().sendText("WebSocket连接成功"); } /** diff --git a/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/service/impl/SysNoticeServiceImpl.java b/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/service/impl/SysNoticeServiceImpl.java index ec5298312..ab90ee588 100644 --- a/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/service/impl/SysNoticeServiceImpl.java +++ b/kernel-s-system/system-business-notice/src/main/java/cn/stylefeng/roses/kernel/notice/modular/service/impl/SysNoticeServiceImpl.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Date; import java.util.List; /** @@ -56,6 +57,7 @@ public class SysNoticeServiceImpl extends ServiceImpl