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

Posted

技术标签:

【中文标题】activemq、jms 主题和带有选择器的订阅者【英文标题】:activemq, jms topics and subscribers with selectors 【发布时间】:2011-10-20 20:26:45 【问题描述】:

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

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

这是正确的行为。

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

我的设置是 ActiveMq 5.5

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

【问题讨论】:

【参考方案1】:

我会说这是一个有缺陷的设计,因为有更好的选择,而且可能是 ActiveMQ 中的一个错误。

第一个问题:您的生产者发布到该主题是否在这些消息上设置了 JMSExpiration 标头?

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

至于有缺陷的设计,当您听到自己说“我需要持久订阅者”并且您正在使用 ActiveMQ 时,您应该立即转而使用虚拟目的地。虚拟目的地具有主题的优点,因为生产者可以将消息发送到目的地并将该消息传播到 N 个其他目的地以供消费,但不具有主题的持久订阅者所带来的缺点。阅读有关Virtual Destinations here 的更多信息。

【讨论】:

【参考方案2】:

这看起来确实像一个错误,(或至少有点不方便)但使用Virtual Destinations 有一个解决方法。

引用:

请注意,将主题设为虚拟确实会增加少量 CPU 开销 向主题发送消息,但它相当小。从版本 5.4、从虚拟主题到订阅队列的dispatch可以 selectorAware 使得只有匹配现有之一的消息 订阅者实际上已被调度。使用此选项可防止 当独占使用选择器时,不匹配的消息的建立 消费者。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于activemq、jms 主题和带有选择器的订阅者的主要内容,如果未能解决你的问题,请参考以下文章

WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 主题消息发布与订阅

WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 主题消息发布与订阅

Apache ActiveMQ教程二 (消息主题订阅)

Apache ActiveMQ教程二 (消息主题订阅)

Spring Integration JMS 创建 ActiveMQ 队列而不是主题

ActiveMQ之队列和主题发布订阅实例