JMS消息优先级不在Message上工作

时间:2011-07-22 09:44:03

标签: activemq hornetq

我需要设置消息优先级,以便接收方在低优先级消息之前消耗高优先级消息。

首先我尝试使用message.setJMSPriority()方法设置优先级,但它在HornetQ和ActiveMQ中不起作用,所以最后我使用setPriority()方法设置Message Producer的优先级,现在它工作正常。

为什么Messsge.setJMSPriority()在任何JMS供应商实现中都不起作用?为什么我们需要设置Producer的优先级而不是消息本身来设置消息的优先级?那么Messsge.setJMSPriority()方法的用途是什么?

感谢任何建议或评论。

4 个答案:

答案 0 :(得分:17)

要回答这个问题,您需要做的就是阅读setJMSPriority方法的API文档,它会告诉您原因。这是相关文字。

  

设置此消息的优先级。

     

JMS提供程序在发送消息时设置此字段。此方法可用于更改已接收消息的值。

JMS提供程序(ActiveMQ,HornetMQ等)将生成器中的优先级设置为发送到默认值4,或者设置为要使用的生成器的任何值,因此在发送之前设置值消息本身不会有任何影响。

答案 1 :(得分:8)

msg.setJMSPriority(9);

在此代码中,消息优先级设置为9,表示这是一个高优先级消息。 但是,当发送消息时,消息的优先级为4(正常 优先)。原因?与消息过期一样,JMS提供程序将查看 消息上的消息优先级属性,并在之前调用setJMSPriority方法 将消息放在队列中。由于默认消息优先级为4(正常 优先级),消息优先级不会像开发人员最初想要的那样设置为高优先级消息。

与消息过期一样,有两种设置消息优先级的方法:您 可以在MessageProducer(QueueSender或Topic)上调用setPriority()方法 发布者)或在发送消息时设置消息优先级:

//set the default message priority for all messages to 9 (high)
QueueSender qSender = qSession.createSender(requestQ);
qSender.setPriority(9);

qSender.send(msg1);
//this message is low priority
qSender.send(msg2, DeliveryMode.PERSISTENT, 1, 30000);

在此示例中,将以优先级9(高优先级)发送msg1,而msg2将发送 优先级为1(低优先级)。

答案 2 :(得分:5)

这是JMS规范要求。

您应该更改Message Producer的优先级。

答案 3 :(得分:0)

您可以阅读JmsTemplate http://static.springsource.org/spring/docs/3.0.6.RELEASE/spring-framework-reference/html/jms.html

某些JMS提供程序允许通过ConnectionFactory的配置来管理性地设置默认QOS值。 检查isExplicitQosEnabled属性。