Приоритет сообщения JMS не работает для сообщения - PullRequest
15 голосов
/ 22 июля 2011

Мне нужно установить приоритет сообщения так, чтобы сообщения с высоким приоритетом использовались получателями перед сообщениями с низким приоритетом.

Сначала я попытался с помощью метода message.setJMSPriority () установить приоритет, но он не работал в HornetQ.и ActiveMQ, и, наконец, я установил приоритет Message Producer с помощью метода setPriority (), и теперь он работает нормально.

Почему Messsge.setJMSPriority () не работает ни в одной из реализаций поставщика JMS и почему мынужно установить приоритет производителя, а не само сообщение, чтобы установить приоритет сообщения?Какая тогда польза от метода Messsge.setJMSPriority ()?

Любое предложение или комментарий приветствуется.

Ответы [ 4 ]

18 голосов
/ 22 июля 2011

Чтобы ответить на этот вопрос, все, что вам нужно сделать, это прочитать документацию по API для метода setJMSPriority и узнать, почему.Вот соответствующий текст.

Устанавливает уровень приоритета для этого сообщения.

Поставщики JMS устанавливают это поле при отправке сообщения.Этот метод можно использовать для изменения значения для полученного сообщения.

Поставщик JMS (ActiveMQ, HornetMQ и т. Д.) Устанавливает приоритет в отправителе как значение по умолчанию:4, или на любое другое значение, которое вы указали для производителя, поэтому установка значения перед отправкой в ​​самом сообщении не будет иметь никакого эффекта.

8 голосов
/ 29 августа 2011
msg.setJMSPriority(9);

В этом коде приоритет сообщения установлен на 9, указывая, что это сообщение с высоким приоритетом.Однако, когда сообщение отправлено, оно будет иметь приоритет 4 (обычный приоритет).Причина?Как и истечение срока действия сообщения, провайдер JMS просматривает свойство приоритета сообщения в сообщении и вызывает метод setJMSPriority до помещения сообщения в очередь.Поскольку приоритет сообщения по умолчанию равен 4 (обычный приоритет), приоритет сообщения не будет установлен на сообщение с высоким приоритетом, как изначально предполагал разработчик.

Как и срок действия сообщения, существует два способа настройкиприоритет сообщения: вы можете вызвать метод setPriority () в MessageProducer (QueueSender или Topic 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 (низкий приоритет).

5 голосов
/ 22 июля 2011

Это требование спецификации JMS.

Вам следует изменить приоритет в Message Producer.

0 голосов
/ 12 декабря 2011

Вы можете прочитать JmsTemplate http://static.springsource.org/spring/docs/3.0.6.RELEASE/spring-framework-reference/html/jms.html

Некоторые провайдеры JMS разрешают устанавливать значения QOS по умолчанию в административном порядке через конфигурацию ConnectionFactory. Проверьте свойство isExplicitQosEnabled.

...