4

私はSpring Frameworkが初めてで、質問は以下のとおりです。

DefaultMessageListenerContainerプログラムでインスタンス化したいのですが、使用するコードは次のとおりです。

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(cf);
container.setDestination(Queue);
container.setMessageListener(Consumer);
container.setReceiveTimeout(-1);
container.setMaxConcurrentConsumers(15);
container.setConcurrentConsumers(10);
container.start();

DefaultMessageListenerContainerプロジェクトのアンデプロイ時に手動でシャットダウンする必要があるのはなぜですか? コンテナーを手動でシャットダウンしないと、コンシューマーはキューで開いたままになります。

コンテナーを手動で ( を呼び出してcontainer.shutdown()) シャットダウンしようとすると、手順がスタックし、プロジェクトが続行されません。DefaultMessageListenerContainerシャットダウン手順を指定せずに初期化すると、receiveTimeout正しく実行されます。に問題はありますsetReceiveTimeout(-1)か?

4

4 に答える 4

1

プログラムで開始したため、リスナーを手動でシャットダウンするだけで済みます。ApplicationContext を使用して xml から Spring Bean をロードする場合、App Context をシャットダウンすると、すべての Bean がシャットダウンされます。

Spring ロード Bean を制御するために私が見つけた最も簡単な方法は、HttpServlet から init() および destroy() メソッドを実装するサーブレットを作成することです。Init() は、xml ファイル (つまり、spring.xml と呼ばれるマスター ファイル) から Spring 構成を読み込み、ApplicationContext オブジェクトをキャッシュします。次に、destory() は ApplicationContext で close() を呼び出します。これにより、すべての Spring Bean がクローズ/シャットダウンされます (つまり、JMS リスナーが停止します)。

プログラムでリスナーを作成している特定の理由はありますか?

于 2013-01-28T16:15:18.747 に答える
0

ここで必要なのは、コンテナーを停止するだけで (シャットダウンしたり、登録を解除したりせずに)、実行時に必要なときに再開できるようにすることです。から継承されたメソッドである .start() と .stop() を使用するだけAbstractJmsListeningContainerです。また、これらを .doStart()、.shutDown()... と混在させないでください。Spring のドキュメントを参照してください。

Spring 経由で接続されたリスナーを使用すると、コンテキストからいつでもリスナーを取得して、.stop または .start を実行できます。Spring の自動配線中に、プロパティautoStartupを false に設定できます。listenerContainer は初期化されますが、起動時にリッスンしません。

于 2013-03-11T15:09:32.303 に答える