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

时间:2015-03-05 21:17:28

标签: node.js rabbitmq node-amqp

这里真的很困惑......

设置一个带死信道具的队列......

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道具正在受到尊重,但不是交换名称。这是在这里看到的......

enter image description here

想法?

编辑:

在下面的

中,您可以看到创建的队列,一旦到期,就会漏入DLX。

enter image description here

3 个答案:

答案 0 :(得分:0)

上面的示例使用路由密钥设置DLX,这很好,但您需要指定一个接受该路由密钥的死信队列。

如果您不需要路由密钥,我建议您使用扇出交换机。我在这里发布了一个答案:

https://stackoverflow.com/a/21864158/1173800

答案 1 :(得分:0)

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

enter image description here

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

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

答案 2 :(得分:0)

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

  • 创建一个到达DLX的队列?检查。
  • 创建DLX?检查。
  • 将数据推送到到期的队列?不。

这是一个范围问题......我我正在循环发布到即将到期的队列的数据,但数据总是一个空数组,因此没有发布任何内容。

一旦我弄明白这一点,队列将填充数据,到达DLX,绑定到DLX的队列将获取数据。

非常感谢@jhilden和我说话。