【问题标题】:Is it necessary to rebuild RabbitMQ connection each time a message is to be sent每次发送消息时是否需要重建 RabbitMQ 连接
【发布时间】:2014-07-23 12:28:56
【问题描述】:

我有一个 Spring 3 应用程序,它通过非 RabbitMQ 接收器接收消息,处理它们并通过 RabbitMQ 转发。每次要发送消息时,都会建立一个新的 RabbitMQ 连接。这似乎有点浪费。我只是想知道这是否真的有必要,或者是否有原因不能在单例中保持连接并且只构建一次(用于多次发送)。这是发送方式:

private void send(String routingKey, String message) throws Exception { 
    String exchange = applicationConfiguration.getAMQPExchange();  
    String ipAddress = applicationConfiguration.getAMQPHost();
    String exchangeType = applicationConfiguration.getAMQPExchangeType();
    String password = applicationConfiguration.getAMQPUser();
    String user = applicationConfiguration.getAMQPPassword();
    String virtualHost = applicationConfiguration.getAMQPVirtualHost();
    String port = applicationConfiguration.getAMQPPort();

    ConnectionFactory factory = new ConnectionFactory();
    factory.setUsername(user);
    factory.setPassword(password);
    factory.setVirtualHost(virtualHost);
    factory.setPort(Integer.parseInt(port));
    factory.setHost(ipAddress);

    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    channel.exchangeDeclare(exchange, exchangeType);
    channel.basicPublish(exchange, routingKey, null, message.getBytes());

    log.debug(" [AMQP] Sent message with key {} : {}",routingKey, message);

    connection.close();
}

或者一个可能的单例:

public class MyConnection {
    private static MyConnection singleton = new MyConnection();
    private static Connection connection;

    private MyConnection() {
        ConnectionFactory factory = new ConnectionFactory();
        String exchange = applicationConfiguration.getAMQPExchange();  
        String ipAddress = applicationConfiguration.getAMQPHost();
        String exchangeType = applicationConfiguration.getAMQPExchangeType();
        String password = applicationConfiguration.getAMQPUser();
        String user = applicationConfiguration.getAMQPPassword();
        String virtualHost = applicationConfiguration.getAMQPVirtualHost();
        String port = applicationConfiguration.getAMQPPort();

        try {
            factory.setUsername(user);
            factory.setPassword(password);
            factory.setVirtualHost(virtualHost);
            factory.setPort(Integer.parseInt(port));
            factory.setHost(ipAddress);
            connection = factory.newConnection();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getInstance( ) {
        return connection;
    }
}

【问题讨论】:

  • 没有。至少在没有连接或套接字级别错误的情况下。

标签: java spring rabbitmq


【解决方案1】:

连接可以是单例的,您可以共享它以进行多次发送。 频道应该是一个线程。

你的代码可能是:

private void send(String routingKey, String message) throws Exception { 
     Connection connection = MyConnection().getInstance();

    Channel channel = connection.createChannel();
    channel.exchangeDeclare(exchange, exchangeType);
    channel.basicPublish(exchange, routingKey, null, message.getBytes());
    log.debug(" [AMQP] Sent message with key {} : {}",routingKey, message);
    channel.close();
}

您可以决定为每次发布创建和销毁一个频道,或者为您的线程创建它并始终重复使用同一个频道。

编辑** 为了创建一个 sigleton 在这里阅读: http://javarevisited.blogspot.it/2012/12/how-to-create-thread-safe-singleton-in-java-example.html

public class MySingletonConnection{
    private static final MySingletonConnection INSTANCE = new MySingletonConnection();
    private Connection myConnection;
    private Singleton(){ 
      // here you can init your connection parameter
    }

    public static MySingletonConnection getInstance(){
        return INSTANCE;
    }

 public Connection getConnection( ) {
    return connection;
}
}

这是创建单例的一种方法

private void send(String routingKey, String message) throws Exception { 
     Connection connection = MySingletonConnection().getInstance().getConnection();

【讨论】:

  • 谢谢你。我在上面添加了一些额外的代码 - 我不确定这是否正确?
  • 我已经修改了答案。
  • 谢谢。我不太确定如何使用 getInstance 方法创建一个返回 Connection 的 Singleton... 很好,非常感谢您的帮助。
  • rabbitmq 连接初始化使用线程,我怎么确定已经连接?
  • 这不起作用,无法在主线程上启动连接!
猜你喜欢
  • 2021-07-18
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多