在我目前的架构中,Spring AbstractPollingMessageListenerContainer 线程轮询来自ActiveMQ队列的消息,将消息从队列调度到远程服务器。
现在我的问题是它如何识别它将从队列发送的消息是否已经被调度?
假设远程服务器向同一AbstractPollingMessageListenerContainer线程发送回响应很慢,因此AbstractPollingMessageListenerContainer线程仍在等待响应,因此无法从队列中删除消息,并且该消息的副本仍在ActiveMQ队列中。
现在假设队列中存在100条消息,由于接收器速度慢,并且已经删除了99条消息,因此仍未从队列中删除1条消息。现在另一个AbstractMollingMessageListenerContainer线程保持从ActiveMQ队列汇集消息将发现此消息,并且它将再次发送此消息,否则它将不会发送此消息,因为它识别此消息已被分派一次。 如果它认为它已经发送,那么请解释它是如何识别的?
谢谢和问候,
Prakash Chandra
答案 0 :(得分:1)
这只是JMS规范的一部分。当消息从队列传递给使用者时,代理将不会将其传递给另一个使用者。当消费者确认交付时(通常在完成处理之后),消息实际上从代理中删除。
如果原始使用者崩溃,代理会检测到它并自动重新排队邮件以便重新传递。同样,如果消费者是事务性的并回滚消息,则会重新排队。
阅读JMS规范。