Java 确保代理保留消息,直到至少有一个消费者收到它
我开始实现一个基于ActiveMQ的消息传递服务,将工作任务发送到各种服务器,但是我注意到,在默认模式下,如果没有人“收听”制作者的主题,那么来自该制作者的任何消息都将丢失 即Java 确保代理保留消息,直到至少有一个消费者收到它,java,apache,jms,activemq,messagebroker,Java,Apache,Jms,Activemq,Messagebroker,我开始实现一个基于ActiveMQ的消息传递服务,将工作任务发送到各种服务器,但是我注意到,在默认模式下,如果没有人“收听”制作者的主题,那么来自该制作者的任何消息都将丢失 即 如果制作者发送带有实时代理的消息 但没有消费者倾听 消息传不出去 我希望代理保留消息,直到至少有一个侦听器收到消息 我正在尝试几种方法来实现这一点,但不确定最佳/正确的方法: 实现消息确认功能 (需要注意的是,我需要制作人在每一条看起来非常、非常笨重和最后手段的消息之后等待听众……) 实现会话事务 (我对这一点有疑
- 如果制作者发送带有实时代理的消息
- 但没有消费者倾听
- 消息传不出去
- 实现消息确认功能
- (需要注意的是,我需要制作人在每一条看起来非常、非常笨重和最后手段的消息之后等待听众……)
- 实现会话事务
- (我对这一点有疑问,因为“交易”这个词,在这里使用它似乎是正确的,但我认为它更多地与制片人-经纪人的互动有关,而不是与制片人-消费者的互动有关)
理想情况下,有一种发送(或一组)消息的模式,发送后返回一个布尔值,说明消息是否被至少一个消费者监听。这实际上不是一种典型的消息模式。通常,您有一个接收者和一个持久队列,或者有多个接收者对一个主题进行持久订阅。在任何一种情况下,每个接收者都将始终收到消息。我真的不理解“至少一个”接收者应该接收它的用例
是的,事务只处理客户和代理之间的交互,而不处理客户和最终接收者之间的交互。事务和确认与JMS主题的总体思想存在某种冲突 只需使用队列而不是主题。使用
CLIENT\u ACKNOWLEDGE
或事务会话访问此队列。工人任务无论如何只能由一个工人处理,因此队列解决了另一个问题
如果使用主题的特殊原因,您可以在同一主机上考虑消息驱动bean(MDB),例如JMS提供者(可以使用JBOSS和其集成的HORNETQ来实现),但这仍然不太正确。
另一种可能是同时拥有一个主题和一个队列。后者仅用于保证每条消息的交付。必须有一个消息确认协议,在生产者到消费者之间工作。我知道这不是一个典型的模式,但必须有一些情况下,它发挥了滚动。。。Hmm@EricS-正如我所说,如果您使用事务和持久队列,那么就没有问题(或对主题的持久订阅)。在任何一种情况下,所有接收者都将始终接收消息。