JMS消息优先级在消息上不起作用



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

首先,我尝试使用Message . setjmpriority()方法来设置优先级,但它在HornetQ和ActiveMQ中不起作用,所以最后我使用setPriority()方法设置了Message Producer的优先级,现在它工作得很好。

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

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

设置此消息的优先级。

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

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

下面的不能工作:

msg.setJMSPriority(9); // Not working!

在此代码中,消息优先级设置为9,表示这是高优先级消息。然而,当消息被发送时,消息的优先级为4(正常)优先级)。的原因吗?与消息过期一样,JMS提供程序将查看消息优先级属性,或者在send(..)调用上,然后在消息方法上调用setjmpriority将消息放到队列中。由于缺省消息优先级为4(正常)(优先级),消息优先级将不会被设置为高优先级消息,正如开发人员最初打算的那样。

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

//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规范的要求。

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

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

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

最新更新