Весной 4 у меня есть следующий файл annotationconfig
@Bean(name = "replicationThreadExecutor")
public Executor replicationThreadExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(threadPoolCoreSize);
executor.setMaxPoolSize(threadPoolCoreSize);
executor.initialize();
return executor;
}
Что меня беспокоит, так это разрушение Executor. Будет ли Spring распознавать, что динамический тип Executor является экземпляром DisposableBean, и уничтожать его, или мне нужно изменить тип возвращаемого значения на ThreadPoolTaskExecutor, чтобы это работало?
Если вы вызываете метод registerShutdownHook на ConfigurableApplicationContext, вызываются все методы уничтожения на singleton beans.
Если процесс умирает, пул потоков пойдет вместе с ним. Проблема, с которой я (потенциально) сталкиваюсь, связана с повторным развертыванием приложения.
В чем проблема с повторным развертыванием и какого поведения вы ожидаете при повторном развертывании
при повторном развертывании я ожидаю, что контекст Spring будет уничтожен, и хочу, чтобы Threadpool был полностью уничтожен.
при повторном развертывании метода уничтожения вызова контейнера Spring для всех singleton beans, даже для веб-приложения, если вы хотите поведение клиента, вы можете настроить Spring bean, который реализует ApplicationListener и дождаться ContextClosedEvent, там вы можете добавить некоторое поведение при уничтожении Threadpool
Как правило, конфигурация на основе Java должна быть настолько конкретной, насколько это возможно, поскольку они проверяются при создании контекста приложения. Следовательно, в этом случае может быть, что обратный вызов не зарегистрирован (хотя с
DisposableBeanон может работать).