SpringJMSを使用してActiveMQキューからメッセージを受信するのを実行して待機するSpringスタンドアロンアプリケーションを作成することに興味があります。私は多くの場所を検索しましたが、そのようなスタンドアロンアプリケーションのメインメソッドを実装する一貫した方法を見つけることができません。 Springスタンドアロンアプリケーションの例はほとんどないようです。私はTomcat、JBoss、ActiveMQ、およびその他の例をWeb全体から見てきましたが、結論に達していないので...
Javaアプリケーション(具体的にはSpring with JMS)のmainメソッドを実装するためのベストプラクティスは何ですか?
Update:ここに例があります: http://forum.springsource.org/showthread.php?t=48197 ですこれを行うための最良の方法は?
public static void main(String args[]) {
try {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
. . . . .
Object lock = new Object();
synchronized (lock) {
lock.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Spring JMSを使用する場合、構成内で自動起動され、アプリケーションを停止するまで存続する(サブスクライブしてキュー/トピックから読み取る)コンポーネント/ Beanを既に使用しています。
したがって、アプリケーションを起動して実行し続けるには、applicationcontextをロードするだけで十分です。ただし、registerShutdownHookも呼び出すことをお勧めします。これにより、アプリケーションが停止すると(つまり、コンソールのctrl + cを介して)、すべてのBeanが正常にシャットダウンされて破棄されます:)
public static void main(String args[]) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
context.registerShutdownHook();
}
これは私たちが持っているものです。app-context.xml内では、(org.springframework.jms.listener.DefaultMessageListenerContainerのようなSpring JMSクラスを使用して、コンシューマーの数を管理し、org .springframework.jms.listener.adapter.MessageListenerAdapter)
app-context.xmlには、すべてのSpring Beanリスナーとその他のものが含まれています。以下のコードは、Springが提供するリスナーをキューにブートストラップしています。したがって、Springクラスを使用して複数のコンシューマーを管理するというアイデアがあります。これが必要であり、MessageListenerAdapterの構成に関する詳細情報が必要かどうかをお知らせください。
public static void main(String[] args)
{
try
{
new ClassPathXmlApplicationContext("app-context.xml");
}
catch (Throwable e)
{
e.printStackTrace();
System.exit(-1);
}
}
主なアイデアは、アプリが終了するまでメインスレッドを待機させることです。 while(!finished)は、メインスレッドがウェイクアップするまで待つ正しい方法です。
finishEventHandler-終了/終了イベントを処理するメソッドです。
JMSの初期化はSpringconfで行われると思います。そして「.....」でセクション。
public static void main(String args[]) {
try {
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
lock = new Object();
while(!finished) {
synchronized (lock) {
lock.wait();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void finishEventHandler() {
finished = true;
lock.notify();
}