2011-07-22 21 views
11

Muszę ustawić priorytet wiadomości tak, aby komunikaty o wysokim priorytecie były zużywane przed komunikatami o niskim priorytecie przez odbiorniki.Priorytet wiadomości JMS nie działa w przypadku wiadomości

Najpierw próbowałem z metodą message.setJMSPriority() ustawić priorytet, ale nie działał w HornetQ i ActiveMQ, więc w końcu ustawiłem priorytet Message Generatora za pomocą metody setPriority() i teraz działa dobrze.

Dlaczego Messsge.setJMSPriority() nie działa w żadnej z implementacji dostawcy JMS i dlaczego musimy ustawić priorytet producenta, a nie samą wiadomość, aby ustawić priorytet wiadomości? Jaki jest zatem pożytek z metody Messsge.setJMSPriority()?

Wszelkie sugestie lub komentarze są mile widziane.

Odpowiedz

16

Aby odpowiedzieć na to pytanie, wystarczy przeczytać dokumentację interfejsu API dla metody setJMSPriority i wyjaśnić, dlaczego. Oto odpowiedni tekst.

Ustawia poziom priorytetu dla tego komunikatu.

Dostawcy JMS ustawiają to pole, gdy wysyłana jest wiadomość. Ta metoda może być użyta do zmiany wartości otrzymanego komunikatu.

JMS Provider (ActiveMQ, HornetMQ itp) ustawić priorytet w producenta na adres albo domyślna wartość 4, lub cokolwiek wartość ustawieniu producenta do użycia, więc ustawienie wartości przed samo wysłanie wiadomości nie będzie miało żadnego efektu.

5

Jest to wymaganie specyfikacji JMS.

Powinieneś zmienić priorytet w Message Generatorze.

8
msg.setJMSPriority(9); 

W tym kodzie priorytet wiadomości jest ustawiony na 9, co oznacza, że ​​jest to komunikat o wysokim priorytecie. Jednak po wysłaniu wiadomości komunikat ma priorytet 4 (normalny priorytet: ). Powód? Podobnie jak w przypadku wygaśnięcia komunikatu, dostawca JMS będzie sprawdzać właściwość priorytetową komunikatu komunikatu w komunikacie i wywoływać metodę setJMSPriority przed , aby umieścić wiadomość w kolejce. Ponieważ domyślny priorytet wiadomości to 4 (normalny priorytet ), priorytet wiadomości nie zostanie ustawiony na wiadomość o wysokim priorytecie, jak pierwotnie zamierzał programista.

Podobnie jak w przypadku wygaśnięcia wiadomości, istnieją dwa sposoby ustawiania priorytetu komunikat: może wywołać metodę setpriority() na MessageProducer (QueueSender lub tematu Publisher) lub ustawić priorytet wiadomości podczas wysyłania wiadomości:

//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); 

W tym przykładzie msg1 zostanie wysłany z priorytetem 9 (wysoki priorytet), natomiast msg2 będzie wysłany z priorytetem 1 (niski priorytet).

Powiązane problemy