5

これまで、JMS コンシューマ アプリケーションを Tomcat (Windows ボックス) にデプロイされた Spring Web アプリケーションとしてデプロイしてきました。これらのコンシューマーは、同じ Tomcat インスタンスの下で他の Web アプリケーションと一緒に実行されます。しかし、私が使用するコンシューマーの数が増えるにつれて、これがメンテナンスの悪夢のようなものになっていることに気付きました。

私の解決策は、これらの webapps を、jar として展開された "main method" スタンドアロン アプリに変換することでした。実際、できるだけ多くのリソース (DAO、依存関係など) を再利用しようとして、それらをすべてうまくパッケージ化することができました。

私の主な方法は次のようになります。

public static void main(String[] args) {

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

    try {
        FooListener fooListener = (FooListener) context.getBean("fooListener");

        fooListener.start();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }

    try {
        BarListener barListener = (BarListener) context.getBean("barListener");

        barListener.start();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }
}

私の質問:

  1. メイン メソッド アプリケーションで JMS 接続をシャットダウンするために何か特別なことをする必要がありますか? それとも、アプリケーションが終了しても問題なくシャットダウンされますか?
  2. Tomcatを使用してjmsコンシューマをデプロイするか、スタンドアロンアプリとしてデプロイするかについて、個人的な好みやその他の点がある人はいますか?

編集:

もう少し情報: FooListener と BarListener は、次の抽象クラスを拡張します。それらは applicationContext.xml ファイル内の対応する Bean から値を継承し、両方とも onMessage() メソッドをオーバーライドしてメッセージを非同期的に消費します。

public abstract class TextMessageListener implements MessageListener {

    protected ConnectionFactory connectionFactory;

    protected String queueName;

    protected String selectors;

    public void start() throws JMSException {
        Connection connection = connectionFactory.createConnection();

        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

        MessageConsumer consumer = session.createConsumer(session.createQueue(queueName), selectors);

        consumer.setMessageListener(this);

        connection.start();
    }

    public abstract void onMessage(Message message);
}
4

1 に答える 1

4

この方法で、アプリケーション コンテキストのシャットダウン フックを登録する必要があります。

context.registerShutdownHook();

これにより、jvm がシャットダウンされると、コンテキストも適切に閉じられます。

私の個人的な好みは、常にコンテナーにデプロイすることです。このようなスタンドアロン アプリであっても、これは次の理由によるものです。

  • アプリケーション war のデプロイ/アンデプロイ、コンテナー ランタイムの開始/停止など、管理がより簡単になります。
  • 何らかの種類の監視を構築する必要がある場合-消費されているメッセージの数、これはこのセットアップで簡単になります.関連情報を表示するWebページを追加するだけで、スタンドアロンアプリケーションでjmxを使用する.

また、listener.start() を明示的に呼び出しているのはなぜですか。Spring コンテナーはとにかくこれを自動的に行いますか?

于 2012-06-08T16:16:30.447 に答える