JMS 消息优先级不适用于 Message

Posted

技术标签:

【中文标题】JMS 消息优先级不适用于 Message【英文标题】:JMS message priority not working on Message 【发布时间】:2011-10-10 22:07:12 【问题描述】:

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

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

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

欢迎提出任何建议或意见。

【问题讨论】:

【参考方案1】:

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

设置此消息的优先级。

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

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

【讨论】:

【参考方案2】:

这是 JMS 规范要求。

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

【讨论】:

API 必须有这种方法,让您误以为它做了某事,而实际上什么也没做?【参考方案3】:
msg.setJMSPriority(9);

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

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

//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(低优先级)发送。

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于JMS 消息优先级不适用于 Message的主要内容,如果未能解决你的问题,请参考以下文章

如何在春季集成中为每个出站 jms 消息设置优先级?

发送到JMS队列的消息将仅由单个消费者使用?

JMS学习四(ActiveMQ消息过滤)

JMS与Spring之二(用message listener container异步收发消息)

JMS 之 Active MQ 消息存储

JMS 之 Active MQ 消息存储