Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确保代理保留消息,直到至少有一个消费者收到它_Java_Apache_Jms_Activemq_Messagebroker - Fatal编程技术网

Java 确保代理保留消息,直到至少有一个消费者收到它

Java 确保代理保留消息,直到至少有一个消费者收到它,java,apache,jms,activemq,messagebroker,Java,Apache,Jms,Activemq,Messagebroker,我开始实现一个基于ActiveMQ的消息传递服务,将工作任务发送到各种服务器,但是我注意到,在默认模式下,如果没有人“收听”制作者的主题,那么来自该制作者的任何消息都将丢失 即 如果制作者发送带有实时代理的消息 但没有消费者倾听 消息传不出去 我希望代理保留消息,直到至少有一个侦听器收到消息 我正在尝试几种方法来实现这一点,但不确定最佳/正确的方法: 实现消息确认功能 (需要注意的是,我需要制作人在每一条看起来非常、非常笨重和最后手段的消息之后等待听众……) 实现会话事务 (我对这一点有疑

我开始实现一个基于ActiveMQ的消息传递服务,将工作任务发送到各种服务器,但是我注意到,在默认模式下,如果没有人“收听”制作者的主题,那么来自该制作者的任何消息都将丢失

  • 如果制作者发送带有实时代理的消息
  • 但没有消费者倾听
  • 消息传不出去
我希望代理保留消息,直到至少有一个侦听器收到消息

我正在尝试几种方法来实现这一点,但不确定最佳/正确的方法:

  • 实现消息确认功能
  • (需要注意的是,我需要制作人在每一条看起来非常、非常笨重和最后手段的消息之后等待听众……)
  • 实现会话事务
  • (我对这一点有疑问,因为“交易”这个词,在这里使用它似乎是正确的,但我认为它更多地与制片人-经纪人的互动有关,而不是与制片人-消费者的互动有关)

理想情况下,有一种发送(或一组)消息的模式,发送后返回一个布尔值,说明消息是否被至少一个消费者监听。

这实际上不是一种典型的消息模式。通常,您有一个接收者和一个持久队列,或者有多个接收者对一个主题进行持久订阅。在任何一种情况下,每个接收者都将始终收到消息。我真的不理解“至少一个”接收者应该接收它的用例


是的,事务只处理客户和代理之间的交互,而不处理客户和最终接收者之间的交互。

事务和确认与JMS主题的总体思想存在某种冲突

只需使用队列而不是主题。使用
CLIENT\u ACKNOWLEDGE
或事务会话访问此队列。工人任务无论如何只能由一个工人处理,因此队列解决了另一个问题


如果使用主题的特殊原因,您可以在同一主机上考虑消息驱动bean(MDB),例如JMS提供者(可以使用JBOSS和其集成的HORNETQ来实现),但这仍然不太正确。


另一种可能是同时拥有一个主题和一个队列。后者仅用于保证每条消息的交付。

必须有一个消息确认协议,在生产者到消费者之间工作。我知道这不是一个典型的模式,但必须有一些情况下,它发挥了滚动。。。Hmm@EricS-正如我所说,如果您使用事务和持久队列,那么就没有问题(或对主题的持久订阅)。在任何一种情况下,所有接收者都将始终接收消息。