修改: 发送消息使用WebSocketSenderApi
This commit is contained in:
parent
51e724fc90
commit
84cea03752
|
@ -1,8 +1,11 @@
|
||||||
package cn.iocoder.yudao.module.im.enums.conversation;
|
package cn.iocoder.yudao.module.im.enums.conversation;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IM 会话类型枚举
|
* IM 会话类型枚举
|
||||||
* 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档
|
* 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">“会话类型”</a> 文档
|
||||||
|
@ -11,12 +14,14 @@ import lombok.Getter;
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum ConversationTypeEnum {
|
public enum ConversationTypeEnum implements IntArrayValuable {
|
||||||
|
|
||||||
SINGLE(1, "单聊"),
|
SINGLE(1, "单聊"),
|
||||||
GROUP(3, "群聊"),
|
GROUP(3, "群聊"),
|
||||||
NOTIFICATION(4, "通知会话");
|
NOTIFICATION(4, "通知会话");
|
||||||
|
|
||||||
|
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ConversationTypeEnum::getType).toArray();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型
|
* 类型
|
||||||
*/
|
*/
|
||||||
|
@ -27,6 +32,11 @@ public enum ConversationTypeEnum {
|
||||||
*/
|
*/
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] array() {
|
||||||
|
return ARRAYS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成会话编号
|
* 生成会话编号
|
||||||
* @param fromUserId 发送者编号
|
* @param fromUserId 发送者编号
|
||||||
|
|
|
@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO;
|
||||||
import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao;
|
import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao;
|
||||||
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
|
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
|
||||||
import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
|
import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
|
||||||
|
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.dromara.hutool.core.date.DateUnit;
|
import org.dromara.hutool.core.date.DateUnit;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -38,7 +39,7 @@ public class InboxServiceImpl implements InboxService {
|
||||||
@Resource
|
@Resource
|
||||||
private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO
|
private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO
|
||||||
@Resource
|
@Resource
|
||||||
private WebSocketMessageSender webSocketMessageSender; // WebSocket消息发送器
|
private WebSocketSenderApi webSocketSenderApi;
|
||||||
@Resource
|
@Resource
|
||||||
private GroupMemberService groupMemberService;
|
private GroupMemberService groupMemberService;
|
||||||
|
|
||||||
|
@ -71,7 +72,7 @@ public class InboxServiceImpl implements InboxService {
|
||||||
|
|
||||||
InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class);
|
InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class);
|
||||||
message.setSequence(userSequence);
|
message.setSequence(userSequence);
|
||||||
webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message);
|
webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,13 +88,15 @@ public class MessageServiceImpl implements MessageService {
|
||||||
messageMapper.insert(messageDO);
|
messageMapper.insert(messageDO);
|
||||||
|
|
||||||
// 设置 InboxSaveMessageReqVO 对象
|
// 设置 InboxSaveMessageReqVO 对象
|
||||||
inboxSaveMessageReqVO.setConversationType(message.getConversationType());
|
inboxSaveMessageReqVO.setConversationType(message.getConversationType())
|
||||||
inboxSaveMessageReqVO.setFromId(fromUserId);
|
.setFromId(fromUserId)
|
||||||
inboxSaveMessageReqVO.setReceiverId(message.getReceiverId());
|
.setReceiverId(message.getReceiverId())
|
||||||
inboxSaveMessageReqVO.setMessageId(messageDO.getId());
|
.setMessageId(messageDO.getId())
|
||||||
inboxSaveMessageReqVO.setContentType(message.getContentType());
|
.setContentType(message.getContentType())
|
||||||
inboxSaveMessageReqVO.setContent(message.getContent());
|
.setContent(message.getContent())
|
||||||
inboxSaveMessageReqVO.setSendTime(messageDO.getSendTime());
|
.setSendTime(messageDO.getSendTime())
|
||||||
|
.setSenderNickname(fromUser.getNickname())
|
||||||
|
.setSenderAvatar(fromUser.getAvatar());
|
||||||
|
|
||||||
// 返回 SendMessageRespVO 对象
|
// 返回 SendMessageRespVO 对象
|
||||||
return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime());
|
return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime());
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
package cn.iocoder.yudao.module.im.websocket;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener;
|
||||||
|
import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;
|
||||||
|
import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
|
||||||
|
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
|
|
||||||
|
// TODO @hao:消息发送,使用 http 上行。因为在 cloud 框架下,我们比较难去 Listener。因为 im-server 不会自己启动 websocket 路径
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebSocket im
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class ImWebSocketMessageListener implements WebSocketMessageListener<ImSendMessage> {
|
||||||
|
|
||||||
|
public static final String IM_MESSAGE_RECEIVE = "im-message-receive";
|
||||||
|
@Resource
|
||||||
|
private WebSocketSenderApi webSocketSenderApi; // WebSocket消息发送器
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理WebSocket消息
|
||||||
|
*
|
||||||
|
* @param session WebSocket会话
|
||||||
|
* @param message 发送的IM消息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onMessage(WebSocketSession session, ImSendMessage message) {
|
||||||
|
Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); // 获取登录用户ID
|
||||||
|
log.info(message.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类型
|
||||||
|
*
|
||||||
|
* @return 类型
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return "im-message-send";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package cn.iocoder.yudao.module.im.websocket.message;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
|
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 消息发送 receive")
|
||||||
|
@Data
|
||||||
|
public class ImReceiveMessage {
|
||||||
|
|
||||||
|
@Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
@InEnum(ConversationTypeEnum.class)
|
||||||
|
private Integer conversationType;
|
||||||
|
|
||||||
|
@Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
|
private Long fromId; // 根据 conversationType 区分
|
||||||
|
|
||||||
|
// TODO @hao:昵称和头像,也直接发给接收人好了;
|
||||||
|
|
||||||
|
@Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
|
||||||
|
private Long messageId;
|
||||||
|
|
||||||
|
@Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
private Integer contentType; // 参见 ImMessageTypeEnum 枚举
|
||||||
|
|
||||||
|
@Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private LocalDateTime sendTime;
|
||||||
|
|
||||||
|
@Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private Long sequence;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package cn.iocoder.yudao.module.im.websocket.message;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
|
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
|
||||||
|
import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - IM 消息发送 send")
|
||||||
|
@Data
|
||||||
|
public class ImSendMessage {
|
||||||
|
|
||||||
|
@Schema(description = "客户端消息编号 uuid,用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
|
||||||
|
private String clientMessageId;
|
||||||
|
|
||||||
|
@Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
@InEnum(ConversationTypeEnum.class)
|
||||||
|
private Integer conversationType;
|
||||||
|
|
||||||
|
@Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
|
private Long receiverId; // 根据 conversationType 区分
|
||||||
|
|
||||||
|
@Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
@InEnum(MessageContentTypeEnum.class)
|
||||||
|
private Integer contentType;
|
||||||
|
|
||||||
|
@Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue