RabbitMQ dead letter exchange never getting messages

前端 未结 7 938
陌清茗
陌清茗 2020-12-12 13:08

I\'m trying to setup my first RabbitMQ dead letter exchange, here are the steps I\'m using through the web admin interface:

  1. Create new DIRECT exchange with the
7条回答
  •  有刺的猬
    2020-12-12 13:34

    Don't need to create FANOUT exchange if it is not compulsory.

    You can create DIRECT exchange using the same routing key which you have used already for other exchange. And also don't need to create a new queue for the new exchange. You can use existing queues with new exchange. You just need to bind that new exchange with the queue.

    Here is my receive.js file:

    var amqp = require("amqplib/callback_api");
    var crontab = require('node-crontab');
    
    amqp.connect("amqp://localhost", function (err, conn) {
    conn.createChannel(function (err, ch) {
        var ex = 'direct_logs';
        var ex2 = 'dead-letter-test';
        var severity = 'enterprise-1-key';
    
        //assert "direct" exchange
        ch.assertExchange(ex, 'direct', { durable: true });
        //assert "dead-letter-test" exchange
        ch.assertExchange(ex2, 'direct', { durable: true });
    
        //if acknowledgement is nack() then message will be stored in second exchange i.e. ex2="dead-letter-test"
        ch.assertQueue('enterprise-11', { exclusive: false, deadLetterExchange: ex2 }, function (err, q) {
            var n = 0;
            console.log(' [*] Waiting for logs. To exit press CTRL+C');
            console.log(q);
    
            //Binding queue with "direct_logs" exchange
            ch.bindQueue(q.queue, ex, severity);
            //Binding the same queue with "dead-letter-test"
            ch.bindQueue(q.queue, ex2, severity);
    
            ch.consume(q.queue, function (msg) {
                // consume messages via "dead-letter-exchange" exchange at every second.
                if (msg.fields.exchange === ex2) {
                    crontab.scheduleJob("* * * * * *", function () {
                        console.log("Received by latest exchange %s", msg.fields.routingKey, msg.content.toString());
                    });
                } else {
                    console.log("Received %s", msg.fields.routingKey, msg.content.toString());
                }
    
                if (n < 1) {
                    // this will executes first time only. Here I'm sending nack() so message will be stored in "deadLetterExchange"
                    ch.nack(msg, false, false);
                    n += 1;
                } else {
                    ch.ack(msg)
                    n = 0
                }
            }, { noAck: false });
        });
      });
    });
    

提交回复
热议问题