Rabbitmq с потоком PoolTaskExecutor и waitForTasksToCompleteOnShutdown разъяснения - PullRequest
0 голосов
/ 01 апреля 2019

Я объявил 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 работать.

Спасибо

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