@jmslistener与同一容器工厂共享线程池

问题描述 投票:0回答:1

我在春季靴子中有2个这样的jmsliteners设置:

@EnableJms

@JmsListener(id= "A1", destination = "dest1", containerFactory = "factory1")
@JmsListener(id= "A2", destination = "dest2", containerFactory = "factory1") 
public void onMessage(String request) {
    //some processing
}

@Bean(name = "factory1")
public JmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory cachingConnectionFactory){
 DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();
    jmsListenerContainerFactory.setConnectionFactory(cachingConnectionFactory);
    jmsListenerContainerFactory.setConcurrency("2-10");
    jmsListenerContainerFactory.setSessionTransacted(true);
    jmsListenerContainerFactory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return jmsListenerContainerFactory;
}

由于2个jmslisteners具有不同的id但共享相同的containerFactory,这两个jmslisteners是否共享同一个线程池?

I.E,如果我在dest1有100条消息,在dest2有1条消息,那么可能所有可用的线程都将被监听器a1占用,并且监听器a2将无法运行直到a1的大多数消息被消耗掉?

理想情况下,这两个应并行运行,我不想在我的处理过程中创建一些异步的未来任务。

jms spring-jms
1个回答
0
投票

他们是独立的;默认情况下,他们每个人都使用单独的SimpleAsyncTaskExecutor

您可以使用TaskExecutor配置工厂,并且容器将使用相同的容器,但是,如果它是池化执行程序,则它必须具有足够的线程来支持所有侦听器的总最大并发性。

© www.soinside.com 2019 - 2024. All rights reserved.