我已經使用ActiveMQ作爲JMS實現(activemq-spring 5.12.1
)和Spring JMS集成(spring-jms 4.2.3.RELEASE
),所有都包裝在Spring Boot Web應用程序中,部署在Tomcat上。由於特定的Spring JMS配置,無法從Tomcat取消部署
我具有以下Spring配置(代碼減少代碼示例的詳細程度):
@Configuration
@EnableJms
public class AppConfiguration {
@Bean
public XAConnectionFactory jmsXaConnection(String activeMqUsername, String activeMqPassword) {
ActiveMQXAConnectionFactory activeMQXAConnectionFactory = new ActiveMQXAConnectionFactory(activeMqUsername, activeMqPassword, activeMqUrl);
ActiveMQPrefetchPolicy prefetchPolicy = new ActiveMQPrefetchPolicy();
prefetchPolicy.setAll(0);
activeMQXAConnectionFactory.setPrefetchPolicy(prefetchPolicy);
return activeMQXAConnectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory, JtaTransactionManager jtaTransactionManager) {
DefaultJmsListenerContainerFactory containerFactory = new DefaultJmsListenerContainerFactory();
containerFactory.setConnectionFactory(connectionFactory);
containerFactory.setTransactionManager(jtaTransactionManager);
containerFactory.setSessionTransacted(true);
containerFactory.setTaskExecutor(Executors.newFixedThreadPool(2));
containerFactory.setConcurrency("2-2");
containerFactory.setCacheLevel(DefaultMessageListenerContainer.CACHE_CONSUMER);
return containerFactory;
}
}
我的目標是配置兩個消費者(因此concurrecny設置爲2-2),並防止任何高速緩存的消息(因此預取策略設置爲0)。
它的工作原理,但會導致很如意的副作用: 當我試圖通過取消部署Tomcat管理器的應用程序,它掛起了一會兒,然後無限期,每秒產生以下DEBUG消息:
"DefaultMessageListenerContainer:563 - Still waiting for shutdown of 2 Message listener invokers"
。
因此,我每次都被迫殺死Tomcat進程。我做錯了什麼?
我的一個幸運鏡頭(ActiveMQ和Spring JMS都沒有幫助),是將預取策略設置爲1而不是0.然後它優雅地展開,但我看不出它是如何關聯的。
另外我很好奇,爲什麼ActiveMQ創建兩個使用者需要將緩存級別設置爲CACHE_CONSUMER
。如果保留默認設置(使用外部事務管理器時爲CACHE_NONE
),則僅創建一個使用者(併發性仍設爲兩個2-2,因此爲TaskExecutor
)。
重要的是,連接工廠和事務管理器使用Atomikos
。我也可以粘貼它的配置,但似乎不相關。