java - RabbitMQ 多线程 channel 和队列绑定(bind)

标签 java multithreading rabbitmq amqp

我继承了一些让我非常头疼的遗留 RabbitMQ 代码。任何人都可以提供帮助,最好是指向一些“官方”文档,我可以在其中浏览类似的问题吗?

我们创建了一些 channel 来接收工作人员的响应,这些工作人员使用如下 channel 执行搜索:

channelIn.queueDeclare("", false, false, true, null);
channelIn.queueBind("", AmqpClient.NAME_EXCHANGE,
     AmqpClient.ROUTING_KEY_ROOT_INCOMING + uniqueId);

我浏览邮件列表和论坛的理解是

  • 声明一个空名称的队列允许服务器自动生成一个唯一的名称,并且
  • 队列必须有一个全局唯一的名字。

这是真的吗?

此外,在上面的第二行中,基于对博客和邮件列表的一些自由解释,我的理解是具有空队列名称的 queuebind 会自动绑定(bind)到最后创建的队列。这看起来不错,因为这样您就不必从笨重的 DeclareOK 对象中提取自动生成的名称。

这是真的吗?如果是这样,这会在多线程环境中工作吗?

即是否有可能某个 channel 将自身绑定(bind)到另一个 channel 的队列,然后如果另一个 channel 关闭,则错误绑定(bind)的 channel 会在尝试使用队列时出错? (请注意,队列是使用 autodelete=true 创建的。)我的测试让我认为是的,但我不确定这就是问题所在。

最佳答案

我不能确定这是否适用于多线程环境。大部分时间可能没问题,但您可能会得到错误的队列。为什么要冒险? 这样不是更好更安全吗?

String queueName = channelIn.queueDeclare("", false, false, true, null).getQueue();
channelIn.queueBind(queueName, AmqpClient.NAME_EXCHANGE,
 AmqpClient.ROUTING_KEY_ROOT_INCOMING + uniqueId);

不是很笨重。

关于java - RabbitMQ 多线程 channel 和队列绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10540029/

相关文章:

java - 如何使用非对称加密在另一个应用程序中解密一个应用程序中的文本?

c# - Parallel.For 没有正确处理锁

spring - Spring AMQP Java 客户端中的队列大小

elasticsearch - 在多机上增加 rabbitmq 吞吐量

python - 如果第一次失败,如何让 Pika 重试连接到 RabbitMQ?

java - 我应该如何在 Runnable 中设置我的 Future 结果?

java - 如何找出使用过的 JAR?

java - Swing worker 卡住应用程序

c# - 应该在属性上使用同步时钟吗?

c# - 如何跟踪 .Net 线程池的使用情况?