TomcatにデプロイするWebアプリケーションを開発しています。Tomcatが起動したら、サーブレット(web.xml内)を使用してJavaクラスを呼び出します。
<web-app>
<display-name>Consumer</display-name>
<servlet>
<servlet-name>start</servlet-name>
<servlet-class>com.test.sample.Consumer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
私のConsumer.javaは、AMQPサーバーのキューにサブスクライブします。while (true)
これは、スタンドアロンのJavaプログラムで正常に機能するループを使用して実現します。これはWebアプリケーションのコンテキストでも機能しますが、Tomcatサーバー(NetBeans IDE内)を停止することはできず、whileループが原因であると考えています。ここにいくつかのコードがあります:
public class Consumer {
public Consumer()
consume();
}
private void consume()
...
while (true) {
// Await incoming messages from queue
// Process message
}
}
}
これを処理するためのより良い方法はありますか?または、ループから抜け出すために停止を通知しますか?
ありがとう!
ServletContextListenerを使用するように更新されました:
public final class ApplicationListener implements ServletContextListener {
private ScheduledExecutorService scheduler;
public ApplicationListener() {
}
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("***** Stopping Consumer *****");
scheduler.shutdownNow();
}
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("***** Starting Consumer *****");
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new ScheduledConsumer(), 0, 15000, TimeUnit.MILLISECONDS);
}
public class ScheduledConsumer implements Runnable {
@Override
public void run() {
Consumer k = new Consumer();
k.consumeOnce();
}
}
}