我正在开发一个要部署到 Tomcat 上的 Web 应用程序。当 Tomcat 启动时,我使用一个 servlet(在 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 程序中运行良好。Itt 也适用于 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();
}
}
}