Завершение работы Tomcat, приводящее к потере данных от службы исполнителя? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть несколько пользователей Kafka, которые собирают сообщения из кластеров Kafka, а затем помещают эти сообщения в службу исполнителя для обработки.Сама обработка сообщения занимает много времени.Когда я пытаюсь завершить работу приложения, то есть выключить Tomcat, я заметил, что служба executor продолжит работать, но гораздо медленнее и с некоторыми исключениями тайм-аута сокета.Это означает, что я могу долго ждать завершения процесса выключения Tomcat, но он просто продолжает работать.Если я вручную убью поток Tomcat, я потеряю много сообщений.Есть ли способ для меня, чтобы решить эту проблему?Большое спасибо!

1 Ответ

0 голосов
/ 02 февраля 2019

Пул потоков живет на

Пул потоков исполнителя может продолжить работу после завершения работы родительского приложения.Поэтому при выходе из приложения всегда следует выполнять плавное завершение исполнителя.

ServletContextListener

В случае веб-приложения, основанного на технологии Java Servlet , Спецификация сервлета определяет ловушку для запуска и выхода вашего веб-приложения.

Этот хук является интерфейсом ServletContextListener.Для этого интерфейса требуется пара методов: один из них вызывается контейнером сервлетов перед обработкой первого входящего запроса в ваше веб-приложение, а другой метод вызывается после отправки последнего ответа.Спецификации требуют, чтобы каждый контейнер сервлета, такой как Tomcat, вызывал эти методы в соответствующие моменты времени.

В этих двух методах есть место для создания экземпляра службы исполнителя и его закрытия.

Вы реализуете интерфейс, написав класс.Вы также должны пометить этот класс в контейнере.Самый простой способ пометить его - с помощью аннотации @WebListener.

Это уже много раз освещалось при переполнении стека.Так что ищите больше информации и примеров.

JSR 236: Утилиты параллелизма для Java TM EE

Эта работа намного проще, если использовать полный-blown Jakarta EE (ранее Java EE ) реализация (Glassfish, Payara, JBoss и т. д.), а не простой контейнер сервлетов (Tomcat, Jetty и т. д.).Такой сервер обеспечит реализацию JSR 236 для автоматической обработки жизненного цикла исполнителя.Так что вам не нужно реализовывать ServletContextListener.

Это также неоднократно решалось при переполнении стека.Так что ищите больше информации.

...