У меня есть ExecutorService executor = Executors.newSingleThreadExecutor();
, который я хочу остановить, когда сервер выключается.ExecutorService не закрывается из contextDestroyed() при остановке Tomcat
У меня есть класс, который implements ServletContextListener
и он аннотируется с @WebListener
.
У меня есть два метода в этом классе:
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContextListener started");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
executor.shutdown();
executor.shutdownNow();
System.out.println("ServletContextListener destroyed");
}
И я вижу, что он печатает, что в обоих из них, когда он должен, но когда я нажимаю на кнопку остановки один раз в intelij, я получаю:
SEVERE: Веб-приложение [], похоже, запустило поток с именем [pool-2-thread-1], но не смог его остановить. Вероятно, это приведет к утечке памяти.
Сразу после печати ServletContextListener destroyed
.
Мне нужно снова нажать кнопку остановки, чтобы полностью остановить ее.
Почему он не отключает службу ExecutorService, хотя он достиг executor.shutdown();
? Что я делаю не так?
PS: это единственная служба ExecutorService, которую у меня есть, и никакие другие потоки не сделаны мной.
EDIT2:
служба исполнитель поле в одноплодной классе, он инициализируется с классом:
private ExecutorService executor = Executors.newSingleThreadExecutor();
Это как инициализируется класс (ленивая инициализация):
public static RoomsManager getRoomsManager(ServletContext servletContext) {
if (servletContext.getAttribute(MANAGER_GAMES_ATTRIBUTE_NAME) == null) {
servletContext.setAttribute(MANAGER_GAMES_ATTRIBUTE_NAME, new RoomsManager());
}
return (RoomsManager)servletContext.getAttribute(MANAGER_GAMES_ATTRIBUTE_NAME);
}
И аннотируется следующим образом:
@WebListener
public class RoomsManager implements ServletContextListener {
Кнопка остановки - красный квадрат рядом с кнопками воспроизведения и отладки в intelij IDEA.
Можете ли вы реализовать shutdown на этих линиях? http://stackoverflow.com/questions/36644043/how-to-forcefully-shutdown-java-executorservice/36644320#36644320 –
@Ravindrababu Я скопировал его в 'contextDestroyed()', это ничего не изменило. Он не печатает '(« Пул не заканчивается »), хотя. Я также пробовал 1 секунду вместо 60. – shinzou
изменение if (! Pool.awaitTermination (60, TimeUnit.SECONDS)) условие для состояния и сна в течение 60 секунд. в то время как i (! pool.awaitTermination (60, TimeUnit.SECONDS)) {Thread.sleep (1000);} –