繁体   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