Ручка остановки кота
Мы используем сервер обмена для получения электронной почты и открываем соединение в течение 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 варианта.
- Ресурс, который вы хотите закрыть - это JVM-объект. Когда вы убиваете JVM - этот объект умирает. Здесь нечего закрывать.
- Ресурс, который вы хотите закрыть, является чем-то постоянным. Тогда - почему вы хотите закрыть его? Просто используйте повторно в новом развертывании.
Если ваш Tomcat не останавливается, возможно, существует еще один бесконечный поток, который еще жив. Таким образом, вы должны остановить этот поток первым в крюке отключения.
И я считаю, что использование ServletContextListener намного лучше, чем addShutdownHook.