Spring Rabbit CachingConnectionFactory 线程池

Spring Rabbit CachingConnectionFactory Thread Pool

我在 10 个不同的虚拟主机中有大约 10 个不同的 rabbit mq 队列要连接。对于每个队列,在我的 spring 引导应用程序中定义了一个单独的 SimpleMessageListenerContainer bean,并且使用每个特定的 SimpleMessageListenerContainer 创建了一个单独的 Spring 集成流。

SimpleMessageListenerContainer 的并发设置为 1-3。每个 SimpleMessageListenerContainer bean 都使用单独的 CachingConnectoryFacory bean。 Connection Factory模式设置为CHANNEL。

我们还有另一个 IntegrationFlow 将消息发布到使用不同连接工厂的出站队列。我没有在 ConnectionFactory 中设置任何 ThreadPool Task Executors,所以它使用默认的。在进行负载测试时,我们注意到多线程池(以 pool- 为前缀)被装箱,并且在某个点之后应用程序崩溃可能是由于线程数过多。

看起来默认线程池执行器的最大值为 Integer unbounded,这可能会根据需求旋转线程。我尝试为每个连接工厂设置自定义线程池任务执行器,我注意到线程没有像以前那样增长,但是从 java 分析器它显示 SimpleMessageListenerContainer 线程经常被阻塞。

我想知道在连接工厂中设置自定义线程池任务执行器(如 Lisneter 线程和连接工厂线程之间的比率等)时是否有任何最佳实践或要遵循?

我做了一些调试; ...-1 重命名为 AMQP Connection 127.0.0.1:5672

该线程不是来自池,而是由同一个线程工厂创建的。

同样,调度执行器(用于心跳)使用相同的线程工厂,并获得 ...-2.

因此池从 ...-3 开始。所以实际上,你有一个固定的 8 个线程池,一个 I/O 线程,每个工厂都有一个心跳线程。

有大量这样的工厂,您可能不需要那么多线程;我建议使用一个具有足够线程的池化执行器来满足您的工作量;实验可能是确定数字的唯一方法,但我猜它小于 88 (11x8)。