即使设置了 DLX 参数,队列路由到默认交换

Queue routing to default exchange even when DLX argument set

这里真的很困惑...

设置死信道具的队列...

var amqp = require('amqp'),
    conn = amqp.createConnection();

var key = "batch.delay." + (new Date().getTime()).toString();
var options = {
  arguments: {
    "x-dead-letter-exchange": "immediate",
    "x-message-ttl": 30000,
    "x-expires": 40000,
    "x-dead-letter-routing-key": 'hit.api'
  }
};

conn.queue(key, options);

并定义实际交换...

conn.exchange('immediate', {
  durable: true,
  autoDelete: false,
  type: 'direct'
}, function (exchange) {
  // other thing...
});

问题是所有流量都通过默认交换而不是死信交换。 ttl 道具被尊重,但不是交换名称。就是这里看到的...

想法?

编辑:

您可以在下方看到已创建的队列,这些队列在到期后应汇入 DLX。

您上面的示例设置了一个带有路由键的 DLX,这很好,但是您需要指定一个接受该路由键的死信队列。

如果您不需要路由密钥,我建议您使用扇出交换。我在这里发布了关于如何做到这一点的答案:

问题是您正试图在每封邮件的基础上设置 x-dead-letter-exchange。在整个队列上设置 DLX。您可以看到您的队列上没有 DLX,如果有,它会有一个如下图所示的 DLX 图标。

然后您将 x-dead-letter-routing-key 添加到各个消息中。

x-expire 也是队列级别设置与消息级别设置。

好的,所以..是这样的:

  • 正在创建一个过期到 DLX 的队列?检查。
  • 正在创建 DLX?检查。
  • 推送数据到过期队列?没有。

这是一个范围问题...我 认为 我正在遍历将发布到即将过期的队列的数据,但数据始终是一个空数组,所以什么都没有发表。

一旦我弄明白了这一点,队列就会填满数据,过期到 DLX,绑定到 DLX 的队列就会获取数据。

非常感谢@jhilden 与我讨论。