RabbitMq应答模式两种:
1.自动应答: 不在乎消费者对消息处理是否成功,都会告诉队列删除消息。如果处理消息失败,实现自动补偿(队列投递过去 重新处理)。
2.手动应答: 消费者处理完业务逻辑,手动返回ack(通知)告诉队列处理完了,队列进而删除消息
而手动应答有如下三个方法
方法 | 作用 |
---|---|
Channel.basicAck | 用于肯定确认 |
Channel.basicNack | 用于否定确认 |
Channel.basicReject | 用于否定确认(不处理该消息了直接拒绝,可以将其丢弃了) |
注意:手动应答时还有一个参数:Multiple 是否批量处理,一般选择false ,不批量处理。
批量处理图解如下
手动应答开启如下
//消息的接收手动应答
boolean autoAck = false;
channel.basicConsume(TASK_QUEUE_NAME,autoAck,deliverCallback,cancelCallback);
//确认接收消息的回调
DeliverCallback deliverCallback = (consumerTag, message) ->{
System.out.println("接收到的消息"+new String(message.getBody()));
/**
* 手动应答
* 1.消息的标记 tag
* 2.是否批量应答
*/
channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
};