Probleme beim Stoppen eines Tomcat-Servers, auf dem eine Webanwendung mit einer while-Schleife (true) ausgeführt wird
Ich entwickle eine Webanwendung für Tomcat. Wenn Tomcat gestartet wird, benutze ich ein Servlet (in web.xml), um eine Java-Klasse aufzurufen:
<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>
Mein Consumer.java abonniert eine Warteschlange auf einem AMQP-Server. Ich erreiche dies mit awhile (true)
Schleife, die in einem eigenständigen Java-Programm funktioniert. Es funktioniert auch im Kontext der Webanwendung, aber ich kann meinen Tomcat-Server (innerhalb meiner NetBeans-IDE) niemals stoppen, und ich glaube, dass die while-Schleife der Schuldige ist. Hier ist ein Code:
public class Consumer {
public Consumer()
consume();
}
private void consume()
...
while (true) {
// Await incoming messages from queue
// Process message
}
}
}
Gibt es eine bessere Möglichkeit, damit umzugehen? Oder um einen Stopp zu signalisieren, um aus der Schleife auszubrechen?
Vielen Dank!
Aktualisiert, um ServletContextListener zu verwenden:
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();
}
}
}