Завершение работы TaskExecutor в веб-приложении, когда веб-сервер выключен - PullRequest
2 голосов
/ 10 февраля 2010

У меня есть веб-приложение, которое использует Spring TaskExecutor. Исполнитель задачи запускается, когда веб-приложение загружается в первый раз, и поток запускает всю жизнь веб-приложения. С тех пор, как я добавил этот поток в приложение, Oracle Application Server больше не будет корректно завершать работу. Я предполагаю, что OAS не закрывается, потому что я не изящно закрываю поток исполнителя задач в любом месте кода Где лучше всего было бы закрыть исполнитель задач в веб-приложении? Я использую Java 5 с Spring 2.5.6.

Вот исполнитель задач, который я использую:

<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>

Ответы [ 3 ]

2 голосов
/ 10 февраля 2010

SimpleAsyncTaskExecutor не имеет значимого состояния, не требует корректного выключения. Кроме того, я не уверен, что вы подразумеваете под «потоком выполняется весь жизненный цикл веб-приложения» - на какой поток вы ссылаетесь?

Однако порождаемые им потоки могут препятствовать завершению работы вашего сервера. SimpleAsyncTaskExecutor использует ThreadFactory для создания своих потоков, и по умолчанию созданные потоки не являются потоками демона, и поэтому все порожденные потоки, которые все еще выполняются при инициализации завершения, будут продолжаться, и сервер будет завершаться только тогда, когда из этих порожденных нитей закончились.

В качестве решения я предлагаю использовать ThreadPoolTaskExecutor вместо SimpleAsyncTaskExecutor. У него есть логическое свойство, которое контролирует, что происходит при завершении работы, и может при необходимости принудительно завершить пул потоков.

Если вы все еще хотите использовать SimpleAsyncTaskExecutor, вы можете добавить его к пользовательскому ThreadFactory, который создает потоки deamon. Это позволит серверу завершить работу независимо от состояния этих порожденных потоков. Однако это может быть опасно, если эти потоки могут оставить ресурсы в нестабильном состоянии.

Spring предоставляет дружественную к бину реализацию ThreadFactory (CustomizableThreadFactory), которую вы можете вставить в SimpleAsyncTaskExecutor, установив для свойства daemon значение false.

0 голосов
/ 17 октября 2014

Вы можете использовать аннотацию @PreDestroy:

@PreDestroy
protected void shutDown() {
    taskExecutor.shutdown();
}
0 голосов
/ 10 февраля 2010

Обычно веб-приложения могут реагировать на отключение контейнера через ServletContextListener. Реализуйте один и используйте его для выключения вашего исполнителя. В идеале вы должны связать это с правильным отключением всего жизненного цикла Spring. Я смутно помню, что у Spring было что-то готовое для этой цели, поэтому, наверное, неплохо бы проверить и там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...