当前位置: 首页 > 知识库问答 >
问题:

RabbitMQ与通道与连接的关系

端木高卓
2023-03-14

RabbitMQ Java客户端有以下概念:

  • 连接-与RabbitMQ服务器实例的连接
  • 通道-???
  • 使用者线程池-使用RabbitMQ服务器队列中的消息的线程池
  • 队列-按FIFO顺序保存消息的结构

我试图理解他们之间的关系,更重要的是,他们之间的联系。

  1. 我仍然不太清楚通道是什么,除了这是您发布和使用的结构,并且它是从一个开放的连接创建的。如果有人能向我解释一下“通道”代表什么,可能有助于澄清一些问题。
  2. 通道和队列是什么关系?可以使用相同的通道与多个队列通信吗?还是必须是1:1?
  3. 队列和消费者池之间的关系是什么?多个使用者可以订阅到同一个队列吗?多个队列可以被同一个消费者消费吗?或者关系是1:1?

共有1个答案

司马飞鸿
2023-03-14

>

  • 连接表示到message broker的真实TCP连接,而通道是其内部的虚拟连接(AMQP连接)。这样,您就可以在应用程序中使用任意多的(虚拟)连接,而不会用TCP连接重载代理。

    您可以使用一个通道进行所有操作。但是,如果您有多个线程,建议为每个线程使用不同的channel

    通道线程-Java客户端API安全指南:

    通道实例对于多线程使用是安全的。进入通道的请求被序列化,一次只有一个线程能够在通道上运行命令。即便如此,应用程序也应该更喜欢使用每个线程的通道,而不是跨多个线程共享相同的通道。

    通道队列之间没有直接关系。通道用于向代理发送AMQP命令。这可以是创建队列或类似的,但这些概念并不是绑定在一起的。

    每个使用者在从使用者线程池分配的自己的线程中运行。如果多个使用者订阅到同一队列,则代理使用循环在它们之间平均分配消息。请参阅教程二:“工作队列”。

    还可以将相同的使用者附加到多个队列。您可以将消费者理解为回调。每次消息到达使用者绑定到的队列时,都会调用这些命令。对于Java客户机,每个使用者都有一个方法handledelivery(...),它表示回调方法。您通常要做的是子类DefaultConsumer并重写HandleDelivery(...)。注意:如果您将同一个使用者实例附加到多个队列,则此方法将由不同的线程调用。因此,如果需要,请注意同步。

  •  类似资料:
    • 我应该在哪里打开和关闭到存储库的连接?在文章“不要重复DAO”中写道: DAO不负责处理事务、会话或连接。这些都是在DAO之外处理的,以实现灵活性。 但有些人建议我将对象注入DAO类,并处理DAO方法内部的所有连接。。。i、 e.每个CRUD操作都应打开和关闭与存储库的连接。

    • 我有一个从Rabbit接收消息的应用程序。当收到一条消息时,它会对它进行处理,然后在完成时执行ACK。应用程序可以在一个固定的线程池中同时处理2个项目,有2个线程。Rabbit的QOS预取设置为2,因为我不想在一个时间框架内给应用提供超过它所能处理的内容。 现在,我的消费者的handleDelivery执行以下操作: 此时,您已经发现TestWrapperThread将调用作为最后一个操作。 根据

    • 问题内容: 我已阅读此文档片段: RabbitMQ自动连接/拓扑恢复 从Spring AMQP的第一个版本开始,该框架在代理发生故障的情况下提供了自己的连接和通道恢复。另外,如第3.1.10节“配置代理”中所述,当重新建立连接时,RabbitAdmin将重新声明任何基础结构Bean(队列等)。因此,它不依赖于amqp- client库现在提供的自动恢复。Spring AMQP现在使用amqp-cl

    • 目前,在WMQ端,有一个名为的队列管理器。在这个队列管理器下,我创建了两个通道。一个是,它没有指定SSL密码规范;另一个是,它用配置SSL密码规范,用配置SSL身份验证。 我已经使用IBM密钥管理工具为队列管理器创建了一个密钥存储区。密钥db的路径是。 对于通道,我定义了一个队列连接工厂,如下所示: 现在我只能使用创建连接。但未能查找SSL队列连接工厂。我的代码如下所示: 在查找SSL工厂时,我是

    • 我正在尝试设置 rabbitmq 它可以通过 nginx 从外部(从非本地主机)访问。 nginx-rabbitmq.conf: rabbitmq.conf文件: 默认情况下,来宾用户只能从本地主机进行交互,因此我们需要创建另一个具有所需权限的用户,如下所示: 但是,当我尝试通过pika连接到Rabbitmq时,我得到了ConntionClo的异常 --[引发连接关闭异常]-- 如果我使用相同的参

    • 我有简单的Spring启动RSocket服务 连接2个Spring服务很容易,但我的客户端应用程序没有Spring,我的客户端应该在RSocket java中 我很难理解如何将(路由,如Spring RocketRequest ester)消息发送到该特定通道。 客户端代码应为: 有可能订阅Spring频道吗?