我们目前正在使用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);
有什么想法吗?这是正常的行为,还是有一些我们会忘记的配置?
答案 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(如果你想避免并发症)