每次发送消息时是否需要重建RabbitMQ连接

2024-02-19

我有一个 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;
    }
}

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

你的代码可以是:

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();
}

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

EDIT**为了创建单例,请阅读此处:http://javarevisited.blogspot.it/2012/12/how-to-create-thread-safe-singleton-in-java-example.html 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每次发送消息时是否需要重建RabbitMQ连接 的相关文章

随机推荐

  • 扩展/插件通信的架构

    一旦解决了加载插件的问题 在 NET 中 在例外情况下通过 MEF 下一步要解决的是与它们的通信 简单的方法是实现一个接口并使用插件实现 但有时插件只需要扩展应用程序的工作方式 并且可能有很多扩展点 我的问题是关于如何处理这些扩展点 我已经
  • 多态调用的成本 - C++

    我正在用 C 编写一个游戏 其中有大约 30 个不同的角色 每个角色都略有不同 我有一个主类 User 其中包含所有角色所需的所有数据 我的第一个实现涉及仅枚举 30 个角色并进行适当的处 理 但现在我想知道将 User 作为基类并且每个角
  • 谷歌搜索引擎优化和隐藏元素

    谷歌会忽略CSS中设置为 display none 的元素内的单词吗 Example div style display none About Us Contact Us div 我想隐藏这样的菜单看起来可能有点奇怪 但是有一个子菜单 并将
  • PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

    我正在尝试定义一个Markdown https hackage haskell org package markdown 0 1 9 docs Text Markdown html新类型 并使用GeneralizedNewtypeDeriv
  • 如何在 Laravel 5 中建立用户和角色关系

    我有两张桌子 User gt id name role id gt references id gt on roles Roles gt id role name access 我正在尝试从用户访问角色详细信息 我的用户模型有 public
  • 如何使用 Bower 进行最小安装

    我使用 Bower 来管理项目中使用的所有前端库和工具 我的bower json文件看起来像这样 name New Project version 0 1 0 dependencies jquery 1 11 1 bootstrap 3 3
  • SqlException:用户“NT AUTHORITY\NETWORK SERVICE”登录失败

    当我通过 VS 2008 运行 Web 应用程序时 该应用程序能够登录到 Sql 服务器并检查用户输入的凭据 用户名和密码 但是当我通过 IIS 7 浏览到该应用程序并尝试回发用户名和密码时 应用程序报告异常 System Data Sql
  • 在 C++ 中描述虚函数的最简洁而准确的方法是什么?

    在评估基本 C 知识的面试中 被要求描述什么是虚函数似乎是最常见的问题之一 然而 在 C 编程几年之后 我仍然有一种不舒服的感觉 即我并不真正理解如何最好地定义它们是什么 如果我查阅维基百科 我看到虚函数的定义是 在面向对象编程中 虚函数或
  • 是否可以选择属性值大于某个数字的所有元素?

    我想知道 CSS 是否可以实现以下功能 HTML 代码 span class funny elem Hello World span span class funny elem Hello Bird span span class funn
  • 系统还原后无法从 Windows 7 卸载 Python 3.4.2

    卸载 Python 3 4 2 几天后 我不得不执行系统还原 我使用的是 Windows 7 因为不小心安装了一堆垃圾软件 即使在安装后 这些垃圾软件也弄乱了我的计算机 这个系统恢复有效地 重新安装 了Python 或者更确切地说是它的损坏
  • printf 中的否定

    我有下面的代码 我不确定为什么 printf 内部的否定与外部的否定不同 char d 0x04 printf Value of d X n d d d printf Value of d X n d 打印的结果是FFFFFFFB和FB 这
  • 语法“%s”和“%d”作为调用变量的简写意味着什么?

    在此示例中 s 和 d 是什么意思 看来它是调用变量的简写 这种语法只能在类中使用吗 Class class Building Object variables properties private number of floors 5 T
  • 当您安装了 Google Analytics 时,_gl 参数对于跨域跟踪的重要性

    我有一个网站及其预订引擎 2 个不同的域 正在运行 访问者登陆该网站 然后进入预订引擎 我已正确安装 Google Analytics 分析 来衡量预订引擎域中发生的转化 一切都正确记录在 Google Analytics 帐户中 我们最近
  • 即使没有任何变化,触摸 DOM 是否会触发回流和重绘?

    我正在开发一个小型 JavaScript 模板引擎 当模型发生变化时 我有两种可能的方法来处理 DOM 的更新 在执行之前检查 DOM 更新是否确实需要 这样做的好处是不会冒不必要的更新风险 但我在跟踪旧值上浪费了空间 if oldValu
  • 发现不同版本的“System.Runtime.CompilerServices.Unsafe”之间存在无法解决的冲突

    这似乎是许多类似问题之一 但我在其他问题中找不到解决方案 我将直接跳到二进制日志 这是相应的子树ResolveAssemblyReference task There was a conflict between System Runtim
  • 使用相对路径检查文件是否存在

    使用相对路径检查文件是否存在的最佳方法是什么 我使用了以下方法 但尽管文件存在 但它返回 false bool a File Exists images Customswipe a png 那不是相对路径 你需要放弃第一个 否则它将被解释为
  • 使用子类中的 getter/setter 对覆盖 JavaScript/TypeScript 基类中的属性是否有效?

    最近 TypeScript引入了编译错误 https github com microsoft TypeScript pull 37894 当用户尝试使用 getter setter 对覆盖基类中的属性时 属性访问增强 class Base
  • 儿童范围 & CS0136

    以下代码无法编译 并指出 无法在此作用域中声明名为 st 的局部变量 因为它会给 st 赋予不同的含义 而 st 已在 子 作用域中用于表示其他内容 var l new List
  • 我应该避免在全局队列中创建 JSContext 吗?

    我刚刚收到客户设备的崩溃日志 它在这里崩溃了 dispatch async dispatch get global queue 0 0 JSContext javaScriptContext JSContext alloc init 这是崩
  • 每次发送消息时是否需要重建RabbitMQ连接

    我有一个 Spring 3 应用程序 它通过非 RabbitMQ 接收器接收消息 处理它们并通过 RabbitMQ 转发 每次发送消息时都会建立一个新的 RabbitMQ 连接 这似乎有点浪费 我只是想知道这是否真的有必要 或者是否有原因导