16

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

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

为什么 Message.setJMSPriority() 在任何 JMS 供应商实现中都不起作用,为什么我们需要设置生产者的优先级而不是消息本身来设置消息的优先级?那么 Messge.setJMSPriority() 方法有什么用呢?

任何建议或评论表示赞赏。

4

4 回答 4

18

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

设置此消息的优先级。

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

JMS 提供者(ActiveMQ、HornetMQ 等)在发送时将生产者中的优先级设置为默认值 4,或者设置为您设置生产者使用的任何值,因此在发送消息之前设置值本身就赢了没有任何作用。

于 2011-07-22T10:37:49.543 回答
10
msg.setJMSPriority(9);

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

和消息过期一样,设置消息优先级的方法有两种:可以调用 MessageProducer(QueueSender 或 Topic Publisher)上的 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(低优先级)的优先级发送。

于 2011-08-29T12:45:30.607 回答
6

这是 JMS 规范要求。

您应该更改消息生产者的优先级。

于 2011-07-22T17:06:21.853 回答
0

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

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

于 2011-12-12T01:57:36.247 回答