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();
        }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage