Java ActiveMQ队列的活动使用者太多

Java ActiveMQ队列的活动使用者太多,java,concurrency,spring-integration,activemq,Java,Concurrency,Spring Integration,Activemq,我的Spring应用程序使用ActiveMQ队列。有两种可能的方法。对于这两种方法,ActiveMQ集成的初始部分是相同的: @Bean public ConnectionFactory connectionFactory() { return new ActiveMQConnectionFactory(); } @Bean public Queue notificationQueue() { return resolveAvcQueueByJNDIName("java:com

我的Spring应用程序使用ActiveMQ队列。有两种可能的方法。对于这两种方法,ActiveMQ集成的初始部分是相同的:

@Bean
public ConnectionFactory connectionFactory() {
    return new ActiveMQConnectionFactory();
}

@Bean
public Queue notificationQueue() {
    return resolveAvcQueueByJNDIName("java:comp/env/jms/name.not.important.queue");
}
单线程方法:

@Bean
public IntegrationFlow orderNotify() {
    return IntegrationFlows.from(Jms.inboundAdapter(connectionFactory()).destination(notificationQueue()),
            c -> c.poller(Pollers.fixedDelay(QUEUE_POLLING_INTERVAL_MS)
                                 .errorHandler(e -> logger.error("Can't handle incoming message", e))))
                           .handle(...).get();
}
但我希望使用几个工作线程来使用消息,因此我将代码从入站适配器重构为消息驱动的通道适配器:

@Bean
public IntegrationFlow orderNotify() {
    return IntegrationFlows.from(Jms.messageDriverChannelAdapter(connectionFactory()).configureListenerContainer(c -> {
                final DefaultMessageListenerContainer container = c.get();
                container.setMaxConcurrentConsumers(notifyThreadPoolSize);
            }).destination(notificationQueue()))
                           .handle(...).get();
}
问题在于,当ActiveMQ的使用者重新部署到Tomcat中或在第二种方法中重新启动时,应用程序不会停止ActiveMQ的使用者。它在启动期间创建新的消费者。但是,所有新消息都被路由到旧的“死”消费者,因此它们被放在“挂起的消息”部分,永远不会退出队列


这里有什么问题

我相信你必须完全阻止Tomcat。通常在重新部署应用程序期间,应该停止并正确清除Spring容器,但看起来情况并非如此:Tomcat重新部署钩子缺少了一些东西。因此,我建议完全停止


另一个选择是忽略外部Tomcat,只需迁移到Spring Boot,它可以启动嵌入式servlet容器。通过这种方式,在重建和重新启动应用程序后不会出现任何泄漏。

谢谢,我知道Tomcat的重新启动有助于解决这个问题,但这不是我的选择,也不是Spring Boot迁移,因为我必须修补现有项目。我正在尝试找到一个选项来重置容器或手动关闭使用者。您肯定需要完全关闭应用程序上下文,让它清理它启动的所有进程。不确定应该在Tomcat中配置什么来正确地执行此操作。。。