これまで、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);
}
}
私の質問:
- メイン メソッド アプリケーションで JMS 接続をシャットダウンするために何か特別なことをする必要がありますか? それとも、アプリケーションが終了しても問題なくシャットダウンされますか?
- 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);
}