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