哪个组件正在创建 null-consumerMonitor-# 线程?

Which component is creating null-consumerMonitor-# threads?

最近我们开始在我们的一个微服务中测试直接容器工厂,改变容器工厂的主要动机是我们想减少处理来自队列的消息的线程数。

通常,当这个微服务使用简单容器工厂启动时,我们会看到一个名为“pool-1-thread-#”的线程组,它是 Rabbit 消费者使用的池。现在我们已经更改为 Direct Container Factory,我们看到两个名为“pool-1-thread-#”和“null-consumerMonitor-#”的线程组。

我们一直在研究应用程序和侦听器配置,但我们无法消除这个“问题”。这是我们的配置,会不会有问题?

这是我们的一位听众:

我们还使用 RabbitListenerConfigurer 将 AfterReceivePostProcessor 配置为工厂,但我们认为它不应引发此行为。

这可能是一个错误吗?我们没想到创建了两个线程组,名称中也没有“null”。

这些线程用于监视消费者(例如,在失败后重试、处理队列更改等)。

这个名字是个错误 (https://github.com/spring-projects/spring-amqp/issues/1433);我们应该使用 getListenerId()(回落到 getBeanName())而不是 getBeanName() - 为注解创建的容器不是 beans。

https://github.com/spring-projects/spring-amqp/blob/909ba571bb096ed8acf77fed43e944f7b8ebb471/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainer.java#L394

将其用作变通方法...

@SpringBootApplication
public class So71468360Application {

    public static void main(String[] args) {
        SpringApplication.run(So71468360Application.class, args);
    }

    @RabbitListener(id = "myListener", queues = "foo")
    void listen(String in ) {

    }

}

@Configuration
class Fixer {

    Fixer(AbstractRabbitListenerContainerFactory<?> factory) {
        factory.setContainerCustomizer(container -> container.setBeanName(container.getListenerId()));
    }

}

或者,在工厂上使用 setTaskScheduler() 以跨多个容器使用共享调度程序。