将来自多个目的地的JMS消息聚合到一个队列中



将来自许多不同来源(实际上是队列/主题)的消息聚合到一个队列/主题中,然后使用它的最佳方式是什么?我正在尝试设计一个应用程序,使用weblogic在JMS中接收来自不同主题的消息。

您可以编写自己的"聚合器"作为独立的Java应用程序:

  • 对于每个队列/主题,在其自己的线程中都有一个读取器
  • 每个读取器在"聚合队列"上再次发送其接收到的消息。

  • 让另一个线程侦听"聚合队列"。

作为一种变体,您可以使用JVM队列(如java.util.concurrent.ArrayBlockingQueue)作为"聚合队列"。这更快,不需要另一个MQ队列,不需要网络带宽,但它不是持久的。


另一个想法是为每个传入队列/主题使用"消息驱动的bean(MDB)":

  • 同样,这些MDB中的每一个只读取消息并将其重新发送到"聚合队列"
  • 让另一个MDB侦听"聚合队列"

关于质量要求的一些建议。我相信你必须考虑一下。它们将与您的技术解决方案高度相关。

  1. 消息丢失可以接受吗?可以考虑客户端ack。例如,内存队列位于中间,例如传入队列1…n->ArrayBlockingQueue in memory->outbound队列。应用程序崩溃时,ArrayBlockingQueue中的数据将丢失。

  2. 对于单个传出队列,该消息重复是否可以接受?我建议是的。设置适用级别PossibleDuplicateFlag以使客户端知道这一点。

  3. diff传入队列上每秒传入消息的速度有多快?一个队列会话只有一个uniqe线程。必须事先考虑性能。

最新更新