在rabbitmq中如何让未被ack的消息能重新能进入queue中再次被取到?
发布于 11 年前 作者 jbasttdi 23347 次浏览 最后一次编辑是 8 年前

各位好,

我刚学rabbitmq,现有个问题。我用的是rabbitmq+nodejs+amqplib,当我打开了noAck:false

  chnl.consume('task_queue', doWork, {noAck: false});

    function doWork(msg) {
        var body = msg.content.toString();
        console.log(" [x] Received '%s'", body);
        var secs = body.split('.').length - 1;
        console.log(" [x] Task takes %d seconds", secs);
        setTimeout(function() {
            console.log(" [x] Done");
            if(body=='Hello World3!'){
            //不会触发chnl.ack(msg)方法,用来模拟业务操作失败,这样这个hello world3!的消息也还在rabbitmq中,不会丢失,但我还是想这些消息再次进入queue中并能被再次取出,如发送邮件失败后还会再重新发送。请问如何再激活这条消息,难道非要重启这个程序吗?
            }else{
                console.log('ack');
                chnl.ack(msg);
            }
        }, secs * 1000);
    }
5 回复

我最近也在用rabbitmq+node.js,很想和楼主讨论一下这方面的问题,呵呵

你在失败的时候再publish到队列中呗,然后ack

可是实际上这条message还是在队列中的,如果再手工publish一下,会有两条信息的。

@jbasttdi你再ack的时候这条消息已经不在队列了啊

原来可以通过channel.nack(message)来让不通过的消息再次进入消息队列。

if(body==‘Hello World3!’){ chnl.nack(msg); //这样就可以让这个消息再次进入队列而不用重启服务。 }else{ console.log(‘ack’); chnl.ack(msg); }

回到顶部