2012-01-13 162 views
6

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

的配置也非常简单:

重点是在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); 

任何想法?这是正常的行为,还是有一些我们已经忘记的配置?

+0

你可能想给最新的ActiveMQ 5.6快照去,因为它在优先领域有几个修复可以改善你的情况。 – 2012-01-13 19:43:19

回答

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

+0

谢谢尤金,我会再看Resequencer。 – nicompte 2012-01-13 14:29:47

0

我知道已经晚了,但这个答案可以帮助别人。

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

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

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

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

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