Приоритет сообщения JMS не работает в Message

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

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

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

Любое предложение или комментарий оценены.

Ответ 1

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

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

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

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

Ответ 2

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 (низкий приоритет).

Ответ 3

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

Вы должны изменить приоритет на Провайдере сообщений.