2016-02-03 46 views
0

我已經使用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。我也可以粘貼它的配置,但似乎不相關。

回答

0

這很可能意味着消費者線程「卡在」用戶代碼中;用jstack進行線程轉儲以查看容器線程正在做什麼。

相關問題