簡體   English   中英

由於特定的Spring JMS配置,無法從Tomcat取消部署

[英]Cannot undeploy from Tomcat due to specific Spring JMS configuration

我使用ActiveMQ作為JMS實現( activemq-spring 5.12.1 )和Spring JMS集成( spring-jms 4.2.3.RELEASE ),它們都包裝在Spring Boot Web應用程序中,並部署在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 Manager取消部署應用程序時,它掛起了一段時間,然后無限期地,每秒產生以下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-2, TaskExecutor也是如此)。

如果有關系,對於連接工廠和事務管理器,將使用Atomikos 我也可以粘貼其配置,但這似乎無關緊要。

這很可能意味着使用者線程被“塞住”了用戶代碼。 使用jstack進行線程轉儲,以查看容器線程在做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM