Я объявил SimpleRabbitListenerContainerFactory в Spring с ThreadPoolTaskExecutor. Когда я просматриваю потоки в вашем комплекте, я вижу все потоки ThreadPoolTaskExecutor, и он использует их одновременно, когда я отправляю сообщения в очереди. Так что все работает отлично.
Проблема в том, что я хочу подождать, пока все сообщения, отправленные моим сервером, будут обработаны, прежде чем завершить его, чтобы мы не теряли сообщение (потому что мы работаем с очередями синхронизации, а не асинхронно, клиент ждет ответа ). Поэтому я установил для параметра setWaitForTasksToCompleteOnShutdown значение true для исполнителя и реализовал прослушиватель контекста для завершения работы исполнителя при событии уничтожения контекста.
Теперь, когда я выключаю сервер, он не уничтожает службы, поэтому сообщения по-прежнему извлекаются из очереди и обрабатываются, но никогда не выключают сервер. Он достигает времени ожидания и убивает все оставшиеся потоки. Например, если он не понимает, что все задачи в управляемых потоках выполнены.
Я попытался посмотреть на потоки с помощью yourkit, и кажется, что все, объявленные моим исполнителем, завершены, а те, что были запущены rabbit (с именем rabbitmq-thread), - нет.
У меня есть вопрос: в чем разница между потоком, управляемым исполнителем, и потоком, управляемым кроликом. Как эти два связаны?
@Bean("analysisExecutor")
public ThreadPoolTaskExecutor analysisExecutor() {
final ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setCorePoolSize(analysisRabbitProperties.getAnalysisRequestMinWorkers() + analysisRabbitProperties.getManualAnalysisResponseMinWorkers());
pool.setMaxPoolSize(analysisRabbitProperties.getAnalysisRequestMaxWorkers() + analysisRabbitProperties.getManualAnalysisResponseMaxWorkers());
pool.setQueueCapacity(10);
pool.setWaitForTasksToCompleteOnShutdown(true);
pool.setThreadNamePrefix("AnalysisExecutor-");
pool.setAwaitTerminationSeconds(120);
return pool;
}
@Bean("analysisReqFactory")
public SimpleRabbitListenerContainerFactory analysisReqListenerFactory() throws Exception {
final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(analysisConnectionFactory());
factory.setMessageConverter(analysisRequestProtoConverter());
factory.setConcurrentConsumers(analysisRabbitProperties.getAnalysisRequestMinWorkers());
factory.setMaxConcurrentConsumers(analysisRabbitProperties.getAnalysisRequestMaxWorkers());
factory.setTaskExecutor(analysisExecutor());
return factory;
}
@WebListener
public class GracefulShutdownListener implements ServletContextListener {
@Autowired
private ThreadPoolTaskExecutor analysisExecutor;
@Override
public void contextDestroyed(final ServletContextEvent sce) {
analysisExecutor.shutdown();
}
}
В основном я хотел бы понять, как заставить waitForTasksToCompleteOnShutdown работать.
Спасибо