如何解决Spring Rabbit CachingConnectionFactory 线程池
我在 10 个不同的虚拟主机中有大约 10 个不同的 rabbit mq 队列要连接。对于每个队列,在我的 Spring Boot 应用程序中定义了一个单独的 SimpleMessageListenerContainer bean,并使用每个特定的 SimpleMessageListenerContainer 创建了一个单独的 Spring Integration 流。
SimpleMessageListenerContainer 的并发设置为 1-3。每个 SimpleMessageListenerContainer bean 都使用单独的 CachingConnectoryFacory bean。连接工厂模式设置为 CHANNEL。
我们还有另一个 IntegrationFlow 用于将消息发布到使用不同连接工厂的出站队列。我没有在 ConnectionFactory 中设置任何 ThreadPool 任务执行器,所以它使用默认的。在进行负载测试时,我们注意到多线程池(以 pool- 为前缀)被打包,并且在某个时间点之后应用程序崩溃可能是由于线程数量过多。
看起来默认线程池执行器的最大值为 Integer unbounded,这可能会根据需求启动线程。我尝试为每个连接工厂设置自定义线程池任务执行程序,我注意到线程没有像以前那样增长,但是从 java 分析器显示 SimpleMessageListenerContainer 线程经常被阻塞。
我想知道在连接工厂中设置自定义线程池任务执行器时是否有任何最佳实践或要遵循的方法,例如 Lisneter 线程和连接工厂线程之间的比率等?
解决方法
我做了一些调试; ...-1
被重命名为,例如 AMQP Connection 127.0.0.1:5672
。
那个线程不是来自线程池,而是由同一个线程工厂创建的。
同样,调度执行器(用于心跳)使用相同的线程工厂,并获得 ...-2
。
因此池从 ...-3
开始。因此,确实,每个工厂都有一个固定的 8 个线程池、一个 I/O 线程和一个心跳线程。
有大量这样的工厂,你可能不需要那么多线程;我建议使用具有足够线程的单个池执行器来满足您的工作量;实验可能是确定数字的唯一方法,但我猜它小于 88 (11x8)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。