В веб-приложении Spring у меня есть несколько DAO и сервисный уровень beans. Один служебный уровень bean имеет аннотированные методы @Async/@Scheduled. Эти методы зависят от других (автоматически) beans. Я создал два потока в XML:
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="2" />
<property name="maxPoolSize" value="5" />
<property name="queueCapacity" value="5" />
<property name="waitForTasksToCompleteOnShutdown" value="true" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
</property>
</bean>
<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
<property name="poolSize" value="10" />
<property name="waitForTasksToCompleteOnShutdown" value="true" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
</property>
</bean>
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler"/>
Все работает так, как ожидалось. Моя проблема в том, что я не могу получить чистое закрытие пулов задач для работы. Задачи работают в базе данных и в файловой системе. Когда я останавливаю веб-приложение, требуется некоторое время, пока он не остановится. Это означает, что свойство waitForTasksToCompleteOnShutdown
работает. Тем не менее, я получаю IllegalStateExceptions в журнале, что указывает на то, что некоторые beans уже уничтожены, но некоторые потоки рабочих задач все еще выполняются, и они терпят неудачу, потому что их зависимости уничтожены.
Существует проблема JIRA, которая может иметь значение: SPR-5387
Мой вопрос: есть ли способ сообщить Spring инициализировать исполнитель/планировщик задач beans last или есть способ сообщить Spring, чтобы сначала их уничтожить?
Я понимаю, что разрушение происходит в обратном порядке init. Поэтому сначала будет уничтожен bean init'ed last. Если пул потоков beans уничтожен первым, все выполняемые в данный момент задачи будут завершены и могут по-прежнему обращаться к зависимым beans.
Я также попытался использовать атрибут зависимости в пулах потоков, ссылаясь на мою службу bean, которая имеет аннотации @Async и @Scheduled. Похоже, что они никогда не исполняются, и я не получаю ошибок инициализации контекста. Я предполагаю, что аннотированная услуга bean каким-то образом сначала инициализируется этими пулами потоков, и если я использую зависящее от меня, я отменяю порядок и делаю их неработоспособными.