如何在不同通道中确认Rabbitmq中的消息

如何在不同通道中确认Rabbitmq中的消息,rabbitmq,Rabbitmq,我有一个关于RabbitMq消费者确认的问题,我阅读了RabbitMq的文档,其中说明确认消息应该在消费者从中接收的同一通道上。但我所处的情况是,由于某种原因,在我收到消息并且没有确认Rabbitmq之后,消费者进程停止了,当消费者进程重新启动时,消费者开始从Rabbitmq获取未确认的消息,但在这里,消费者无法向这些消息发送确认,因为我收到一个通道异常,表明标记不属于该通道。因此,我的问题是如何处理这种情况,以及在我的使用者进程完成读取消息后,如何确认rabbitmq以删除该消息? 确认必须在

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

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

要做到这一点,最简单的方法是使用
autoack=true
,这样消息一旦被使用就会自动确认

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

如果自动确认不适用于您,您可以使用
channel\u 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);

我们只希望在执行某些操作(如保存/处理消息)后确认,因此不希望自动确认。对于channel_consumer.basicCancel(consumerTag);是否有任何限制,就像它应该在同一个频道的巴斯卡克有?如果是这样,那么basicCancel也不能在我的场景中使用。