2

Spring構成でspring-jmsタグを使用して複数のJMSコンシューマーを起動するスタンドアロンのJavaアプリケーションがあります。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

Beanの定義は次のようになります。

<bean id="fooConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${foo_broker_url}" />
</bean>

<jms:listener-container connection-factory="fooConnectionFactory" acknowledge="client" client-id="fooService">
    <jms:listener destination="${foo_queue_name}" ref="fooListener" selector="${foo_selector}" />
</jms:listener-container>
...

コンシューマーを起動するためのWindowsバッチファイルと、コンシューマーをシャットダウンする別のバッチファイルを作成する予定です(今のところ、コマンドラインを使用して起動しています)。

私の問題は2つあり
ます。1。シャットダウンバッチファイルは実際に接続をシャットダウンする方法を教えてください。
2.キューがすでに接続されているときにスタートアップバッチファイルが実行された場合、アプリケーションに2番目の接続を作成させたくありません。これを防ぐ方法はありますか?

質問2について:キューにメッセージを送信して応答または失敗を待つことはうまくいくかもしれないことを理解していますが、それはやり過ぎのようであり、より良い方法があるはずです。これは、javax.jms.ConnectionクラスのAPIドキュメントで読みました。

「このメソッドが呼び出されたときに同じclientIDを持つ別の接続がすでに実行されている場合、JMSプロバイダーは重複IDを検出し、InvalidClientIDExceptionをスローする必要があります。」

ただし、リスナーコンテナでclientIDを指定しても(上記のBean定義を参照)、2番目の接続が妨げられることはないようです。

アップデート

最も簡単な解決策は、このアプリケーションをTomcatでWebアプリケーションとして実行することであると判断しました。ただし、提起された質問のいずれかに対して誰かが実行可能な解決策を提供することを期待して、質問は開いたままにしておきます。

最初の質問は、次のように言い換え/明確にすることができます。別のアプリケーション/スクリプトを実行して、実行中のアプリケーション/スレッドを終了するにはどうすればよいですか?

2番目の質問は、次のように質問することで詳しく説明できます。キューへのJMSプロデューサー接続に関連して一意になるデータはありますか?この一意のデータに基づいて、「この」接続がすでに存在していることを確認できますか?

4

1 に答える 1

0

これらの問題を処理する最も簡単な方法は、スタンドアロンをWebアプリケーションに変換し、Tomcatでデプロイすることであると判断しました。このようにして、アプリケーションの開始/停止をより簡単に管理できるようになり、アプリケーションの1つのインスタンスのみが一度に実行されるようにすることができます。

今後もこの質問を監視していきますので、お気軽にご自身の解決策を投稿してください。受け入れられた回答を変更させていただきます。

于 2012-06-29T21:19:52.733 に答える