我们正在使用ACTIVEMQ作为消息代理。对于其中一个队列,我们发现生成消息的速率远高于消耗消息的速率。有时这会导致ACTIVEMQ崩溃。
因此,我们正在探索提高消耗率的选项。 (首要任务是增加现有消费者的数量,然后增加消费者吊舱/实例的数量)。
以下是当前侦听器配置
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
factory.setMessageConverter(jacksonJmsMessageConverter());
return factory;
}
侦听器逻辑与数据库多次交互,并且可以被视为I / O绑定任务。因此,我们正在考虑并行处理多个消息。
我们找到了以下选项。
我们已同意1-1
的暗示concurrentConsumers and maxConcurrentConsumers
为1,一次仅处理1条消息。这是配置,我们可以增加为5-10
,以便最小5和最大10个使用者可以同时运行。
我们还发现我们也可以在侦听器工厂中设置TaskExecutor
。像设置threadPoolExecutor (corePoolSize = 5, maxPoolSize = 10, queueCapacity=50)
一样,也将帮助我们同时处理消息。
我不确定采用哪个选项(1或2)
DefaultMessageListenerContainer.setTaskExecutor()
的JavaDoc这样说:
设置Spring
DefaultMessageListenerContainer.setTaskExecutor()
以用于运行侦听器线程。默认为
TaskExecutor
,根据指定的并发使用者数,启动多个新线程。指定用于与现有线程池集成的替代方法
SimpleAsyncTaskExecutor
。请注意,这仅在以特定方式(例如在Java EE环境中)管理线程时才真正增加价值。普通线程池不会增加太多价值,因为此侦听器容器在其整个生命周期内都会占用许多线程。
因此,设置任务执行程序的主要用例是与现有线程池集成。默认执行程序已经根据您配置的并发使用者的数量进行扩展。因此,我不建议您设置任务执行器。
我建议仅设置并发。
您需要通过仔细的基准测试和分析来确定最佳值。在开始该过程之前,我强烈建议您设置一个特定的性能目标,因为没有目标,基准测试和优化就可能成为无休止的任务。
您可能还考虑使用SimpleAsyncTaskExecutor
,以便队列首先不会变得很满。