2

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

IE,

  • 如果生产者向实时代理发送消息
  • 但是没有消费者可以听
  • 消息无处可去

相反,我希望 Broker 保留消息,直到至少一个侦听器收到它。

我正在尝试几种实现方式,但不确定最佳/正确的方式:

  • 实现消息确认功能
  • (对此需要注意的是,我需要生产者在每条消息之后等待其侦听器,这看起来非常非常笨拙和最后的手段......)
  • 实现会话事务
  • (我在这个问题上遇到了麻烦,因为交易这个词,在这里使用它听起来是正确的,但我认为它更多地与生产者 - 经纪人互动有关,而不是生产者 - 消费者)

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

4

2 回答 2

1

事务和确认在某种程度上与 JMS 主题的一般概念相冲突。

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


如果有使用主题的特殊原因,您可以考虑像 JMS 提供程序一样在同一主机上使用消息驱动 bean (MDB)(例如,您可以通过使用 JBoss 及其集成的 HornetQ 来实现这一点),但这仍然不是真的正确的。

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

于 2013-09-26T07:03:07.057 回答
0

这并不是典型的消息传递模式。通常,您有一个接收器和一个持久队列或多个具有持久订阅主题的接收器。在任何一种情况下,每个接收者都会收到消息。我真的不明白“至少一个”接收器应该接收它的用例。

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

于 2013-09-26T01:07:00.780 回答