我使用Spring Boot处理来自RabbitMQ队列的消息。我想并行处理消息。似乎我无法并行处理比我拥有的使用者数量更多的消息,即使使用更大的线程池也是如此。例如。如果我想并行处理多达200个消息,那么我的线程池中当然需要200个线程,但是显然我也需要200个使用者。似乎有很多消费者,我担心这是否可能是性能/资源使用问题。我希望能够在没有200个使用者的情况下并行处理200 msgs。那可能吗?怎么样?
例如通过这种“配置”,我永远不会并行处理10多个msg。我将不得不增加factory.setConcurrentConsumers和factory.setMaxConcurrentConsumers来处理更多
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(MessageConverter contentTypeConverter) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrentConsumers(10);
factory.setMaxConcurrentConsumers(10);
factory.setMessageConverter(contentTypeConverter);
factory.setTaskExecutor(listenerTaskExecutor());
factory.setDefaultRequeueRejected(true);
return factory;
}
public ThreadPoolTaskExecutor listenerTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("my-listener-");
executor.setCorePoolSize(200);
executor.setMaxPoolSize(200);
executor.initialize();
return executor;
}
@Bean
@Primary
public RabbitTemplate rabbitTemplate(MessageConverter contentTypeConverter, RegisteredConfirmCallback callback) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
((CachingConnectionFactory)rabbitTemplate.getConnectionFactory()).setPublisherConfirms(true);
rabbitTemplate.setChannelTransacted(false);
rabbitTemplate.setMessageConverter(contentTypeConverter);
rabbitTemplate.setConfirmCallback(callback);
return rabbitTemplate;
}