Kłopoty z zatrzymaniem serwera tomcat, który uruchamia aplikację WWW z pętlą (prawdziwą)
Opracowuję aplikację internetową do wdrożenia na serwerze Tomcat. Kiedy Tomcat jest uruchomiony, używam serwletu (w web.xml), aby wywołać klasę 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>
Mój Consumer.java subskrybuje kolejkę na serwerze AMQP. Osiągam to za pomocąwhile (true)
pętla, która działa poprawnie w autonomicznym programie Java. Itt działa również w kontekście aplikacji internetowej, ale nigdy nie mogę zatrzymać mojego serwera Tomcat (w obrębie mojego IDE NetBeans) i uważam, że sprawcą jest pętla while. Oto kod:
public class Consumer {
public Consumer()
consume();
}
private void consume()
...
while (true) {
// Await incoming messages from queue
// Process message
}
}
}
Czy jest lepszy sposób na to poradzić? Lub zasygnalizować zatrzymanie, aby wyjść z pętli?
Dzięki!
Zaktualizowano, aby użyć 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();
}
}
}