2012-01-13 28 views
6

現在、JMSとactivemq(5.5.1)を使用してアプリケーションを開発中です。 一部のメッセージの優先度を高く設定したい場合は、最初にメッセージを消費させてしまいます。 プロデューサとコンシューマ(spring(3.1)JMSTemplateを介して)を設定すると、優先度は完全には機能しません。 実際、消費者を "オフ"にしていくつかのメッセージを送信すると、優先度は尊重されますが、消費者がオンのときにメッセージを追加すると、メッセージは送信されたのと同じ順序で受信されます。activemqの優先度

設定は非常に簡単です:

優先順位は、ActiveMQの設定ファイルで活性化した。

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

およびQoSはプロデューサーテンプレートの設定で有効になっていました:

<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> 

送信するにはメッセージは優先度が高く、プロデューサ側のテンプレート優先度プロパティを変更するだけです:

template.setPriority(9); 

これは正常な動作ですか、あるいは忘れてしまった設定ですか?

+0

最新のActiveMQの5.6-SNAPSHOTになど行くを与えたいと思うかもしれませんそれはあなたの状況を改善する可能性がある優先順位の分野でいくつかの修正があります。 –

答えて

7

何か不足していると思われない場合は、数週間前に(しかし、TTLとQPidで)同様の問題が発生しました。

まずJMSはこの程度厳密ではありません。

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. 

第二に、ActiveMQのは、まだプライオリティキューを実装していない、彼らはそれがどこか6.xのバージョンであろうと言います。

これは実際には正常です。

回避策として、あなたのケースに合っている場合は、Resequencerパターンを使用することができます。ここで

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

このテーマに関する別の議論です:

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

+0

ユージンありがとう、私はリスケンサーを見ていきます。 – nicompte

0

私はそれが遅れている知っているが、この答えは、誰かを助けるかもしれません。

優先度(優先度キュー)に基づいて消費者がメッセージを消費するようにする場合は、クライアント側のメッセージ優先度を使用できます。これは、コンシューマーにメッセージが送信されているとき(コンシューマーがプレフェッチを使用する前であっても)、コンシューマー側でキャッシュされ、デフォルトで優先順位が付けられます。これは、ブローカー側の優先サポートを使用しているかどうかに関係なく行われます。これはあなたが消費者に見える注文に影響する可能性があるので、これを念頭に置いてください。

有効にするには、ブローカーURLに次の設定オプションを設定します。だから、あなたは(あなたが合併症を避けたい場合)キャメルを使用することを必要としない、tcp://0.0.0.0:61616?jms.messagePrioritySupported=false

それを無効にするには、

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