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

questionAnswers(2)

yourAnswerToTheQuestion