2016-09-13 7 views
1

現在、以下に示すようにJMSListenerがあります。これは、プロパティファイルの値のセレクタを使用します。これは正常に動作します。JMSListener - 動的セレクタ

@JmsListener(destination = "myQueueDest", 
    selector = MyHeaders.SELECTOR_KEY + " = '${myapp.selector_val}'") 
private void consumeData(MyCustomObj mycustomObj) { } 

Iは、メモリ内の値ではなく、バネ性と動的セレクタを使用することが今必要としています。 JMSListener(または他のリスナ・メカニック)を使用してActiveMQキューから選択を解除する方法はありますか?

更新:

私の@JMSListenerにIDを割り当て、その後、私のJmsListenerEndpointRegistry豆から取得することも可能です。リスナーコンテナをIDで取得し、DefaultMessageListenerContainerにキャストし、setMessageSelector()に電話してください。まだ動作するかどうかは完全にはわかりませんが

これは、キャッシュレベルがCACHE_SESSIONになるようにDefaultJmsListenerContainerFactory Beanを設定する必要があります。

しかし、これは動作していないようです。リスナーは、メッセージセレクタを設定したものに関係なく、すべてのメッセージを取得します。

答えて

0

JMS仕様では、コンシューマの作成中に選択文字列を指定する必要があることが示されています。だから答えはNOです。さまざまな選択基準に一致するメッセージを受信するには、コンシューマーを閉じて、別の選択文字列で再作成する必要があります。

JMS APIを使用することがプロジェクトの必須項目ではない場合は、アクティブMQのネイティブAPIを使用して検索できます。私は、APIが、受信が呼び出されるたびに別の選択文字列を指定する方法を持っていると確信しています。 IBM MQのネイティブAPIは、このような機能を提供します。

+0

新しい消費者をどのように閉じて再作成するのですか? @JmsListenerを使用せずにリスナを完全にプログラムで作成するという例がありますか?ありがとう。 –

+0

春のドキュメントを参照してください。私のSpringの知識は非常に限られています。 – Shashi

+0

setMessageSelectorのjavadocは、実行時に設定できることを示しています。 http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/jms/listener/AbstractMessageListenerContainer.html#setMessageSelector(java.lang.String) –

関連する問題