如何在其他频道的Rabbitmq中确认消息

时间:2018-11-22 08:37:47

标签: rabbitmq

我对RabbitMq消费者确认有一个查询,我阅读了RabbitMq上的文档,指出确认消息应位于消费者收到的同一通道上。但是我处于这样的情况下,由于某种原因,接收到消息后消费者进程停止,并且没有确认Rabbitmq,当消费者进程重新启动时,消费者开始从RabbitMq获取未确认的消息,但是这里消费者无法发送确认这些消息,因为我得到一个频道异常,说明该标签不属于该频道。因此,我的问题是如何处理这种情况?在我的使用者进程完成读取消息后,如何确认Rabbitmq删除消息?

1 个答案:

答案 0 :(得分:1)

正如您所说的acknowledgement must be sent on the same channel

  

确认必须在接收其所要发送的同一通道上发送。尝试使用其他通道进行确认将导致通道级协议异常

最简单的方法是使用autoack=true,因此一旦使用该消息,就会自动对其进行确认。

boolean autoAck = true; // acknowledgment is covered below
channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer);

编辑

如果auto_ack不适合您,则可以使用channel_consumer.basicCancel(consumerTag);

类似的东西:

   final Consumer consumer = new DefaultConsumer(channel_consumer) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
          String message = new String(body, "UTF-8");

          System.out.println(" [x] Received '" + message + "'");
          try {
            channel_consumer.basicCancel(consumerTag);
            System.out.println(" [x] stopping" + message + "'");

            try {
              Thread.sleep(10000);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
            System.out.println(" [x]  elaborated getting ack" + message + "'");
            channel_consumer.basicAck(envelope.getDeliveryTag(), false);

          } finally {
            System.out.println(" [x] Done");
          }
        }
      };
      boolean autoAck = false; // acknowledgment is covered below
      channel_consumer.basicConsume("test", autoAck, consumer);