我有一个使用Spring Integration的Spring Boot应用程序。应用程序从RabbitMQ队列中提取消息,转换该消息中的数据,聚合50条转换后的消息,将这些消息放入数组中,并将它们作为JSON发送到RESTful端点。我看到记忆慢慢爬上,直到应用程序崩溃。
我在我们的应用程序上运行了一个分析器,并且随着时间的推移有一些VariableLinkedBlockingQueue的实例。应用程序似乎在应用程序启动后清理它们,但一段时间后,应用程序将只构建这些实例。我通过我的应用程序上的探查器强制完整的垃圾收集,它清理了一些实例,但它们继续建立起来。这些实例仅在将消息发送到队列时上升。预取设置为50。
为什么我看到这些实例会积聚,我该如何解决?
答案 0 :(得分:0)
com.rabbitmq.client.impl.WorkPool
使用VariableLinkedBlockingQueue
,其逻辑基于注册/取消注册Channel
作为客户端。
如果正确关闭Channel
,它们将从该池中注销,因此它们的VariableLinkedBlockingQueue
将被垃圾回收。
没有您的应用程序查看和播放很难确定泄漏的位置。
Spring Integration AMQP支持已经存在了一段时间,如果出现这样的问题,请不要关闭频道,我们已经知道了。
现在,您似乎开始使用ConnectionFactory
开箱即用,并且在使用后不会关闭频道/连接。