Ручка остановки кота

Мы используем сервер обмена для получения электронной почты и открываем соединение в течение 30 минут, а затем автоматически открываем его в течение следующих 30 минут. Но когда мы хотим развернуть новый war-файл и остановить службу Tomcat, соединение не закрывается, а период соединения не заканчивается (30 минут). Таким образом, служба tomcat не может быть запущена в течение этого интервала. Я пытался обработать остановку сервера с помощью крюка отключения, как это

    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){
        public void run() {
            connection.close();
        }
    }));

но это не работает Есть ли другой способ закрыть соединение?

Подключение к серверу обмена в новой теме. Tomcat 7.

Также мы хотим обработать (закрыть соединение) остановку кота любым способом.

PS Извините за мой английский.

Обновление: Я обнаружил, что метод уничтожения bean-компонента выполняется, но соединение закрывается через 1-2 минуты. Это все еще слишком долго для веб-сайтов.

2 ответа

Если вы убьете Java, процесс завершения работы не будет работать, конечно. Следовательно, вы не можете справиться с подобной ситуацией каким-либо распространенным способом.

Но подумайте, что является причиной закрытия соединения, когда вы останавливаете сервер? Какие ресурсы остаются открытыми, когда сервер убит?

У нас есть 2 варианта.

  1. Ресурс, который вы хотите закрыть - это JVM-объект. Когда вы убиваете JVM - этот объект умирает. Здесь нечего закрывать.
  2. Ресурс, который вы хотите закрыть, является чем-то постоянным. Тогда - почему вы хотите закрыть его? Просто используйте повторно в новом развертывании.

Если ваш Tomcat не останавливается, возможно, существует еще один бесконечный поток, который еще жив. Таким образом, вы должны остановить этот поток первым в крюке отключения.

И я считаю, что использование ServletContextListener намного лучше, чем addShutdownHook.

Другие вопросы по тегам