RabbitMQ Spring Boot并行味精处理,没有可能的使用者

时间:2019-04-17 08:50:36

标签: spring spring-boot parallel-processing rabbitmq

我使用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;
}

0 个答案:

没有答案