正确关闭RabbitMQ频道和连接

时间:2017-08-21 15:19:47

标签: java spring rabbitmq connection channel

我目前正在运行基本的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()不会删除所使用的通道和连接,并且仍将它们保留在内存中,最终导致所有内存被消耗。什么是在频道和连接上使用的正确方法,以确保他们不这样做?

1 个答案:

答案 0 :(得分:0)

  

但是,当我查看我的RabbitMQ管理界面时(在概述中)   页面),全局计数部分显示两者的总数   连接和渠道不断增加。

我认为您的连接存在问题。

检查操作系统中的TCP连接,例如:

1. netstat -anp | grep :5672 | grep ESTABLISHED | wc -l

使用命令行工具检查您的连接:

2. rabbitmqctl list_connections 如果您在12中有很多连接,则意味着您没有以正确的方式关闭连接/频道。

如果需要处理大量连接,可以增加文件描述符配置:

例如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是紧密连接