首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于特定的Spring JMS配置,无法从Tomcat取消部署

由于特定的Spring JMS配置,无法从Tomcat取消部署
EN

Stack Overflow用户
提问于 2016-02-03 20:32:40
回答 1查看 242关注 0票数 0

我使用了ActiveMQ作为JMS实现(activemq-spring 5.12.1)和Spring JMS集成(spring-jms 4.2.3.RELEASE),它们都包装在Spring Boot web应用程序中,并部署在Tomcat上。

我有以下Spring配置(减少了代码示例的冗长):

代码语言:javascript
运行
复制
@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取消部署应用程序时,它挂起了一段时间,然后无限期地,每秒都会产生以下调试消息:

"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。我也可以粘贴它的配置,但这似乎无关紧要。

EN

回答 1

Stack Overflow用户

发布于 2016-02-03 22:35:40

这很可能意味着使用者线程被“卡住”在用户代码中;使用jstack进行线程转储,看看容器线程在做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35177224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档