JMS选择器与单个队列

时间:2015-10-28 10:59:12

标签: filter queue jms activemq consumer

我有一个应用程序,它使用来自我的AMQ代理上的队列的消息。我可能需要此应用程序的多个实例(出于性能原因),在这种情况下,每个实例都应使用来自队列的消息子集。应根据传入消息上的“HeaderA”标头的值来选择此子集。

即。

  • 实例1使用HeaderA == x
  • 的消息
  • 实例2使用HeaderA == Y
  • 的消息

(注意:我知道这个设计不是很好,如果所有实例都是等效的并且可以使用任何消息会更好,但出于外部原因我受限于此设计)

我正在考虑两种方法;

  1. 使用Apache Camel在Broker上路由消息,以便有 为每个唯一值的单独队列(动态创建) 'HeaderA'。然后每个实例动态地订阅它的队列 感兴趣的是。

  2. 每个实例在同一队列上创建一个使用者但使用JMS 选择器只消耗它感兴趣的消息。

  3. 哪种方法被认为是“最好的”,为什么?创建可能数千个单独队列的唯一标头值是否危险?使用JMS选择器有什么警告吗?

1 个答案:

答案 0 :(得分:2)

我会选择选择者。

尽管理论上可以动态地动态创建队列,但大多数(所有?)JMS提供程序(如ActiveMQ)都没有针对数千个队列进行优化。我应该指出,它可能会奏效。只需检查您的设置不会增加线程使用或文件描述符使用(或类似资源)。

使用JMS选择器没有太大的痛苦。一个潜在的问题可能是选择器中的类型o可能消耗太多消息或根本没有消息而没有指示错误。需要进行广泛的系统测试。

另一件事 - ActiveMQ管理控制台和Hawt.io等管理工具不是为支持大量队列而构建的。如果您打算使用它们,请考虑不要使用比所需更多的队列。