在我的应用程序中有一个列表publisherPostListenerList
,它从RabbitMQ队列接收实时用户帖子以发送给订阅者/消费者。该列表是ApplicationListener
类的属性,该类监听pubsub队列的事件。下面的控制器方法通过基于逻辑推送帖子给订阅者的getter方法&获取列表元素。为集群环境创建列表
的流程如下
用户写入一个后 - >发布进入DB +队列 - >从队列消息列表中的哪个是publisherPostListenerList
被推向用户的用户加入。
正如我们所见,publisherPostListenerList
是n个并发请求的共同列表,因为ApplicationListener
是一个单身人士。对于单个实例的安装工作正常,但会在群集环境中失败,因为每个节点都会有自己的个人publisherPostListenerList
名单。
我该如何处理这种情况?我不能让ApplicationListener
类无状态我需要列表来存储从队列中收到的帖子元素。我是否将列表放入分布式内存缓存中?或者还有其他传统方式?
ApplicationListener.java
@Component
public class ApplicationEventListener {
private List<Post> publisherPostListenerList = new CopyOnWriteArrayList<Post>();
private static final Logger logger = Logger.getLogger(ApplicationEventListener.class);
@EventListener
public void postSubmissionEventHandler(PostSubmissionEvent event) throws IOException {
Post post = event.getPost();
logger.debug("application published user post received " + post);
publisherPostListenerList.add(post);
}
public List<Post> getPublisherPostListenerList() {
return publisherPostListenerList;
}
public void setPublisherPostListenerList(List<Post> publisherPostListenerList) {
this.publisherPostListenerList = publisherPostListenerList;
}
}
控制器方法用于推动消息发送到订户
@RequestMapping(value="/getRealTimeServerPushUserPosts")
public SseEmitter getRealTimeServerPushUserPosts(@RequestParam("userId") int userId){
SseEmitter sseEmitter = new SseEmitter();
CustomUserDetail myUserDetails = currentUserAccessor.getCurrentLoggedInUser();
User loggedInUser=myUserDetails.getUser();
List<Integer> userPublisherIDList = this.userService.loadUserPublisherIdListWhichLoggedInUserFollows(loggedInUser);
List<Post> postList =eventListener.getPublisherPostListenerList();
for(Integer userPublisherId : userPublisherIDList){
for(Post post:postList){
if((userPublisherId.intValue()) == (post.getUser().getUserId().intValue())){
try {
sseEmitter.send(post);
postList.remove(post); //removes the post for all the subscribers as the list acts as a global list.
} catch (IOException e) {
logger.error(e);
}
}
}
}
return sseEmitter;
}
谁将会调用控制器的方法? – developer
我使用的服务器发送的事件推消息发送到客户端/与loggedInUser – underdog
为什么不能ü使用数据库呢? – developer