activemq优先级

时间:2012-01-13 10:48:00

标签: java spring jms activemq

我们目前正在使用JMS和activemq(5.5.1)开发应用程序。 我们希望为某些消息定义更高的优先级,这将使它们首先被消耗。 设置生产者和消费者(通过spring(3.1)JMSTemplate)后,优先级不能完全发挥作用。 实际上,当我们“关闭”消费者并发送一些消息时,优先权得到尊重,但是当我们在消费者开启时添加消息时,消息将按照发送的顺序接收。

配置非常简单:

在activemq配置文件中激活了优先级:

<policyEntries>
  <policyEntry queue=">" prioritizedMessages="true"/>
  ...
</policyEntries>

在生产者模板配置中启用了QoS:

<bean id="jmsOCRTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory" />
  <property name="defaultDestination" ref="destination_ocr" />
  <property name="explicitQosEnabled" value="true" />
</bean>

要发送具有高优先级的消息,我们只需更改生产者端的模板优先级属性:

template.setPriority(9);

有什么想法吗?这是正常的行为,还是有一些我们会忘记的配置?

2 个答案:

答案 0 :(得分:7)

如果我的意见你没有遗漏任何东西,我几周前也有类似的问题(但是有TTL和QPid)。

首先,JMS对此不严格:

JMS does not require that a provider strictly implement priority ordering of messages; however, it should do its best to deliver expedited messages ahead of normal messages.

其次,ActiveMQ没有实现优先级队列,他们说它会在6.x版本的某个地方。

所以,你看到的实际上是正常的。

作为一种解决方法,如果适合您的情况,您可以使用Resequencer模式。

http://camel.apache.org/resequencer.html

以下是关于这个主题的另一个讨论:

http://activemq.2283324.n4.nabble.com/Priority-message-td2352179.html

答案 1 :(得分:0)

我知道现在已经很晚了,但这个答案可能对某些人有帮助。

如果您希望消费者根据优先级(优先级队列)使用消息,则可以使用客户端消息优先级。这意味着,当消息发送给您的消费者时(甚至在您的消费者使用预取之前接收消息之前),它们将被缓存在消费者端并默认优先级。无论您是否在代理方使用优先支持,这都是一样的。这可能会影响您在消费者身上看到的顺序,所以请记住这一点。

要启用它,请在代理URL上设置以下配置选项,例如

tcp://0.0.0.0:61616?jms.messagePrioritySupported=true

要禁用它,tcp://0.0.0.0:61616?jms.messagePrioritySupported=false

所以你不需要使用Camel(如果你想避免并发症)