|
@@ -2,27 +2,20 @@ package com.webchat.service.queue;
|
|
|
|
|
|
import com.webchat.common.enums.ChatMessageTypeEnum;
|
|
|
import com.webchat.common.enums.RedisKeyEnum;
|
|
|
+import com.webchat.common.enums.RedisMessageChannelTopicEnum;
|
|
|
import com.webchat.common.util.JsonUtil;
|
|
|
-import com.webchat.controller.client.ChatWebSocket;
|
|
|
import com.webchat.domain.vo.request.mess.ChatMessageRequestVO;
|
|
|
-import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
|
|
|
-import com.webchat.domain.vo.response.mess.ChatMessageResponseVO;
|
|
|
-import com.webchat.domain.vo.response.mess.PublicAccountArticleMessageVO;
|
|
|
-import com.webchat.domain.vo.response.publicaccount.ArticleBaseResponseVO;
|
|
|
import com.webchat.repository.dao.IArticleDAO;
|
|
|
import com.webchat.service.ChatMessService;
|
|
|
import com.webchat.service.FriendService;
|
|
|
-import com.webchat.service.UserService;
|
|
|
-import com.webchat.service.publicaccount.ArticleService;
|
|
|
+import com.webchat.service.listener.RedisMessageSender;
|
|
|
import com.webchat.service.queue.dto.ArticleDelayConsumeMessageDTO;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.PostConstruct;
|
|
|
-import javax.websocket.Session;
|
|
|
import java.util.Set;
|
|
|
|
|
|
/**
|
|
@@ -35,13 +28,11 @@ public class ArticlePublishQueue extends AbstractRedisQueue<ArticleDelayConsumeM
|
|
|
@Autowired
|
|
|
private FriendService friendService;
|
|
|
@Autowired
|
|
|
- private ArticleService articleService;
|
|
|
- @Autowired
|
|
|
- private UserService userService;
|
|
|
- @Autowired
|
|
|
private ChatMessService chatMessService;
|
|
|
@Autowired
|
|
|
private IArticleDAO articleDAO;
|
|
|
+ @Autowired
|
|
|
+ private RedisMessageSender redisMessageSender;
|
|
|
|
|
|
@PostConstruct
|
|
|
public void initBean() {
|
|
@@ -73,42 +64,18 @@ public class ArticlePublishQueue extends AbstractRedisQueue<ArticleDelayConsumeM
|
|
|
}
|
|
|
// 1. 拿公众号
|
|
|
String publicAccount = data.getPublicAccount();
|
|
|
- UserBaseResponseInfoVO publicAccountUser = userService.getUserInfoByUserId(publicAccount);
|
|
|
// 2. 获取文章信息
|
|
|
Long articleId = data.getArticleId();
|
|
|
- ArticleBaseResponseVO articleBaseResponse = articleService.getArticleDetailFromCache(articleId);
|
|
|
// 3. 走redis拿公众号下所有订阅用户
|
|
|
Set<String> subscribeUsers = friendService.listSubscribeFriendIds(publicAccount);
|
|
|
if (CollectionUtils.isEmpty(subscribeUsers)) {
|
|
|
return;
|
|
|
}
|
|
|
- // 4. 处理在线场景推文
|
|
|
- for (String userId : subscribeUsers) {
|
|
|
- // 4.1 获取公众号所有订阅且在线用户(需要实时推文)
|
|
|
- Session session = ChatWebSocket.clients.get(userId).getSession();
|
|
|
- if (session == null || !session.isOpen()) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- // 4.2 构造文章卡片
|
|
|
- PublicAccountArticleMessageVO publicAccountArticleMessageDTO = new PublicAccountArticleMessageVO();
|
|
|
- publicAccountArticleMessageDTO.setArticleId(articleBaseResponse.getId());
|
|
|
- publicAccountArticleMessageDTO.setCover(articleBaseResponse.getCover());
|
|
|
- publicAccountArticleMessageDTO.setDescription(articleBaseResponse.getDescription());
|
|
|
- publicAccountArticleMessageDTO.setTitle(articleBaseResponse.getTitle());
|
|
|
- publicAccountArticleMessageDTO.setTime(System.currentTimeMillis());
|
|
|
-
|
|
|
- ChatMessageResponseVO publicAccountArticleMessage = new ChatMessageResponseVO();
|
|
|
- publicAccountArticleMessage.setType(ChatMessageTypeEnum.PUBLIC_ACCOUNT_ARTICLE.getType());
|
|
|
- publicAccountArticleMessage.setSenderId(publicAccount);
|
|
|
- publicAccountArticleMessage.setSender(publicAccountUser);
|
|
|
- publicAccountArticleMessage.setReceiverId(userId);
|
|
|
- publicAccountArticleMessage.setMessage(JsonUtil.toJsonString(publicAccountArticleMessageDTO));
|
|
|
-
|
|
|
- // 3.3 实时推文
|
|
|
- session.getAsyncRemote().sendText(JsonUtil.toJsonString(publicAccountArticleMessage));
|
|
|
- }
|
|
|
- // 5. 处理离线场景推文
|
|
|
+ // 4. 处理离线场景推文
|
|
|
this.doExecWriteData(articleId, publicAccount, subscribeUsers);
|
|
|
+ // 5. 发布公众号推文消息到PUSH_ARTICLE Topic,在RedisMessageListener中完成推送(分布式websocket)
|
|
|
+ redisMessageSender.sendMessage(RedisMessageChannelTopicEnum.PUSH_ARTICLE.getChannel(), JsonUtil.toJsonString(data));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public void doExecWriteData(Long articleId, String publicAccount, Set<String> receiverIds) {
|