activemq,jms主题和带选择器的订阅者

时间:2011-08-05 12:44:12

标签: jms activemq publish-subscribe

我需要一些关于主题和选择器的帮助。

我有一个主题有多个持久订阅者(每个都有一个选择器)的场景  并非消费者不会阅读所有进入主题的消息 - 因为选择器不匹配。

这是正确的行为。

但是,当不匹配的邮件达到特定数量阈值时会出现问题,因为此时没有其他邮件正在传递给消费者  activemq尝试发送那些旧的无法匹配的消息,但由于没有消费者,所以一切都被卡住了  任何人都可以帮忙吗?

我的设置是ActiveMq 5.5

是否有一些配置选项,还是只是一个有缺陷的设计?

3 个答案:

答案 0 :(得分:3)

我认为这是一个有缺陷的设计,因为有更好的选择,也许是ActiveMQ中的一个错误。

第一个问题:您的制作人是否正在发布此主题,在这些消息上设置JMSExpiration标头?

如果是的话,我要做的第一件事是create a Jira issue详细说明你上面描述的场景,因为看起来ActiveMQ会继续保持并继续发送没有选择器的消息似乎是不正确的。

对于有缺陷的设计,当您听到自己说“我需要持久用户”并且您正在使用ActiveMQ时,您应该立即转而使用虚拟目标。虚拟目的地具有主题的优点,因为生产者可以将消息发送到目的地并且将该消息传播到N个其他目的地以供消费,但是没有在主题上具有持久订户的缺点。详细了解Virtual Destinations here

答案 1 :(得分:2)

这与ActiveMQ处理稀疏选择器的方式有关。当前实现不会进入商店寻找与稀疏选择器匹配的消息,因此您需要进行一些配置更改以尝试解决此问题。您可以在配置的目标策略中设置maxBrowsePageSize,默认值为400.请参阅此page

ActiveMQ中的虚拟目的地可能是更好的选择,它几乎总是考虑使用持久订阅者。但是,如果您使用SNAPSHOT版本的ActiveMQ 5.6,则可以向消息添加一些消息过期,并将策略配置为使非活动持久订阅者上的消息过期。

答案 2 :(得分:1)

它确实看起来像一个bug,(或者至少是不方便的)但是有一个使用Virtual Destinations的工作。

引用:

  

请注意,使主题虚拟确实会增加一小部分CPU开销   向主题发送消息,但它相当小。从版本   5.4,从虚拟主题调度到订阅队列即可   selectorAware这样只有匹配现有的消息   订阅者实际上是派遣的。使用此选项可防止   当独占使用选择器时,会产生不匹配的消息   消费者。