gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:27:22 28 4
gpt4 key购买 nike

我已经使用 ActiveMQ 作为 JMS 实现(activemq-spring 5.12.1)和 Spring JMS 集成(spring-jms 4.2.3.RELEASE),全部包含在部署在 Tomcat 上的 Spring Boot Web 应用程序。

我有以下 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;
}
}

我的目标是配置两个消费者(因此并发设置为 2-2)并防止任何消息缓存(因此预取策略设置为 0)。

它有效,但会导致非常不愉快的副作用:当我尝试通过 Tomcat 管理器取消部署应用程序时,它会挂起一段时间然后无限期地挂起,每秒都会产生以下 DEBUG 消息:

“DefaultMessageListenerContainer:563 - 仍在等待关闭 2 个消息监听器调用程序”

因此,我每次都被迫杀死Tomcat进程。我做错了什么?

我的一个幸运镜头(ActiveMQ 和 Spring JMS 的文档都没有那么有用)是将预取策略设置为 1 而不是 0。然后它会优雅地取消部署,但我看不出它有什么关系。

另外我很好奇,为什么 ActiveMQ 需要将缓存级别设置为 CACHE_CONSUMER 才能创建两个消费者。当保留默认设置时(CACHE_NONE 使用外部事务管理器时),只会创建一个消费者(同时并发性仍设置为 2 2-2,TaskExecutor 也是如此)。

如果重要的话,对于连接工厂和事务管理器,使用 Atomikos。我也可以粘贴它的配置,但它似乎无关紧要。

最佳答案

这很可能意味着消费者线程“卡在”了用户代码中;使用 jstack 进行线程转储以查看容器线程正在做什么。

关于java - 由于特定的 Spring JMS 配置,无法从 Tomcat 取消部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35177224/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com