2012-01-13 17 views
6

Aktualnie rozwijamy aplikację za pomocą JMS i activemq (5.5.1). Chcielibyśmy zdefiniować wyższy priorytet dla niektórych wiadomości, co spowodowałoby ich zużycie w pierwszej kolejności. Po ustawieniu producenta i konsumenta (poprzez wiosnę (3.1) JMSTemplate) priorytet nie działa w pełni. Rzeczywiście, gdy "wyłączamy" konsumenta i wysyłamy wiadomości, priorytet jest respektowany, ale kiedy dodajemy wiadomości, gdy konsument jest włączony, wiadomości są odbierane w tej samej kolejności, w jakiej zostały wysłane.Priorytet z activemq

Konfiguracja jest bardzo prosta:

Priorytet został aktywowany w ActiveMQ pliku konfiguracyjnym:

<policyEntries> 
    <policyEntry queue=">" prioritizedMessages="true"/> 
    ... 
</policyEntries> 

i QoS została włączona w konfiguracji szablonu producent:

<bean id="jmsOCRTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="defaultDestination" ref="destination_ocr" /> 
    <property name="explicitQosEnabled" value="true" /> 
</bean> 

aby wysłać wiadomość o wysokim priorytecie, po prostu zmieniamy właściwość priorytetu szablonu po stronie producenta:

template.setPriority(9); 

Każdy pomysł? Czy to normalne zachowanie, czy też jest jakaś konfiguracja, o której zapomnielibyśmy?

+0

Możesz chcieć dać Ostatni ActiveMQ 5,6-snapshot GO jako ma kilka poprawek w obszarze priorytetu, które mogłyby poprawić twoją sytuację. –

Odpowiedz

7

Jeśli w mojej opinii niczego nie brakuje, to miałem podobny problem kilka tygodni temu (ale z TTL i QPid).

Najpierw JMS nie jest Strict o tym:

JMS does not require that a provider strictly implement priority ordering of messages; however, it should do its best to deliver expedited messages ahead of normal messages. 

drugie, ActiveMQ nie ma jeszcze wdrożyć kolejki priorytetowe, mówią, że to będzie gdzieś w wersji 6.x.

To, co widzisz, jest w rzeczywistości normalne.

Jako obejście można użyć wzoru Resequencer, jeśli pasuje on do twojego przypadku.

http://camel.apache.org/resequencer.html

Oto kolejna dyskusja na ten temat:

http://activemq.2283324.n4.nabble.com/Priority-message-td2352179.html

+0

Dziękuję Eugene, popatrzę wtedy na Resequencer. – nicompte

0

Wiem, że jest późno, ale to odpowiedzi może pomóc komuś.

Jeśli chcesz, aby konsument korzystał z wiadomości w oparciu o priorytet (kolejka priorytetowa), możesz użyć priorytetu wiadomości po stronie klienta. Oznacza to, że kiedy wiadomości są wysyłane do twojego konsumenta (nawet zanim klient odbierze je, używając wstępnego pobierania), będą one buforowane po stronie konsumenta i priorytetowo ustawione domyślnie. Jest to niezależne od tego, czy korzystasz z obsługi priorytetowej po stronie brokera. Może to wpłynąć na porządek, jaki widzisz na kliencie, więc miej to na uwadze.

Aby włączyć tę funkcję, ustaw następującą opcję konfiguracji w adresie URL brokera, np.,

tcp://0.0.0.0:61616?jms.messagePrioritySupported=true 

Aby ją wyłączyć, tcp://0.0.0.0:61616?jms.messagePrioritySupported=false

Więc nie wymaga korzystania wielbłądowatych (jeśli chcesz uniknąć komplikacji)