我需要一些关于主题和选择器的帮助。
我有一个主题有多个持久订阅者(每个都有一个选择器)的场景 并非消费者不会阅读所有进入主题的消息 - 因为选择器不匹配。
这是正确的行为。
但是,当不匹配的邮件达到特定数量阈值时会出现问题,因为此时没有其他邮件正在传递给消费者 activemq尝试发送那些旧的无法匹配的消息,但由于没有消费者,所以一切都被卡住了 任何人都可以帮忙吗?
我的设置是ActiveMq 5.5
是否有一些配置选项,还是只是一个有缺陷的设计?
答案 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这样只有匹配现有的消息 订阅者实际上是派遣的。使用此选项可防止 当独占使用选择器时,会产生不匹配的消息 消费者。