我继承了一些让我非常头疼的遗留 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/