我需要设置消息优先级,以便接收者在低优先级消息之前消耗高优先级消息。
首先我尝试使用
message.setJMSPriority()
方法来设置优先级,但它不适用于我尝试过的任何 JMS 代理(例如 HornetQ 和 ActiveMQ),所以最后我使用 MessageProducer
方法设置 setPriority()
的优先级,现在效果很好。
为什么
Messsge.setJMSPriority()
在任何 JMS 供应商实现中都不起作用,为什么我们需要设置生产者的优先级而不是消息本身来设置消息的优先级?那么Messsge.setJMSPriority()
方法有什么用呢?
要回答这个问题,您所需要做的就是阅读 setJMSPriority 方法的 API 文档,它会告诉您原因。这是相关文字。
设置此消息的优先级。
JMS 提供程序在发送消息时设置此字段。此方法可用于更改已接收消息的值。
JMS 提供程序(ActiveMQ、HornetMQ 等)在发送时将生产者中的优先级设置为默认值 4,或者设置为您设置生产者使用的任何值,因此在发送消息本身之前设置该值不会有任何影响。
以下不起作用:
msg.setJMSPriority(9); // Not working!
在此代码中,消息优先级设置为9,表示这是一条高优先级消息。 然而,当消息发送时,该消息的优先级将为4(正常 优先事项)。原因?与消息过期一样,JMS 提供者将查看 发送者或 send(..) 调用上的消息优先级属性,然后先调用消息方法上的 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);
在此示例中,msg1 将以优先级 9(高优先级)发送,而 msg2 将以 以优先级 1(低优先级)发送。
这是 JMS 规范要求。
您应该更改消息生产者的优先级。
您可以阅读JmsTemplate http://static.springsource.org/spring/docs/3.0.6.RELEASE/spring-framework-reference/html/jms.html
一些 JMS 提供程序允许通过 ConnectionFactory 的配置来管理设置默认的 QOS 值。 检查 isExplicitQosEnabled 属性。