我目前正在运行基本的RabbitMQ主题发布,每3秒发布一次。
我的班级看起来像这样:
import com.rabbitmq.client.*;
import java.io.IOException;
public class EmitLogTopic {
private static final String EXCHANGE_NAME = "topic_logs";
@Scheduled(fixedRate = 3000)
public void publish(String[] argv)
throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String routingKey = getRouting(argv);
String message = getMessage(argv);
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes());
System.out.println(" [x] Sent '" + routingKey + "':'" + message + "'");
channel.close();
connection.close();
}
//...
}
我希望每次方法发布运行时,它都会发布,然后通道和连接都会关闭,防止新通道和连接每隔3秒钟卡在内存中。
然而,当我查看我的RabbitMQ管理界面(在概述页面)时,全局计数部分显示连接和通道的总数不断增加。
最终,我的应用程序因Socket限制和内存限制而崩溃。
所以似乎close()不会删除所使用的通道和连接,并且仍将它们保留在内存中,最终导致所有内存被消耗。什么是在频道和连接上使用的正确方法,以确保他们不这样做?
答案 0 :(得分:0)
但是,当我查看我的RabbitMQ管理界面时(在概述中) 页面),全局计数部分显示两者的总数 连接和渠道不断增加。
我认为您的连接存在问题。
检查操作系统中的TCP连接,例如:
1. netstat -anp | grep :5672 | grep ESTABLISHED | wc -l
使用命令行工具检查您的连接:
2. rabbitmqctl list_connections
如果您在1
和2
中有很多连接,则意味着您没有以正确的方式关闭连接/频道。
如果需要处理大量连接,可以增加文件描述符配置:
例如https://www.rabbitmq.com/install-debian.html
使用systemd(最近的Linux发行版)
在使用systemd的发行版上,操作系统限制通过a来控制 配置文件在 /etc/systemd/system/rabbitmq-server.service.d/limits.conf,for 例如:
[服务] LimitNOFILE = 300000
修改强>
您发布的代码很好,close()
方法是关闭连接的正确方法。
如果执行代码,您应该在实际代码中进行调查。
如果有以下内容,也请在日志内检查:
=INFO REPORT==== 22-Aug-2017::09:23:28 ===
connection <0.383.0> ([::1]:60590 -> [::1]:5672): user 'guest' authenticated and granted access to vhost '/'
=INFO REPORT==== 22-Aug-2017::09:23:37 ===
closing AMQP connection <0.383.0> ([::1]:60590 -> [::1]:5672, vhost: '/', user: 'guest')
closing AMQP connection
是紧密连接