在春季启动中,我有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个jmslistener具有不同的ID但共享相同的containerFactory,所以这2个jmslistener是否共享相同的线程池?
IE,如果我在dest1上有100条消息,在dest2上有1条消息,是否所有可用线程都将由侦听器a1占用,并且侦听器a2将无法运行,直到a1的大多数消息都被执行消耗了吗?
理想情况下,这2个应并行运行,我不想在处理中创建一些异步的未来任务。
答案 0 :(得分:0)
它们是独立的;默认情况下,它们各自使用单独的SimpleAsyncTaskExecutor
。
您可以使用TaskExecutor
配置工厂,并且容器将使用相同的容器,但是,如果它是池执行器,则它必须具有足够的线程来支持所有侦听器的总最大并发性。