ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。
有三种确认方式:
自动确认:acknowledge=“none”
手动确认:acknowledge=“manual”
根据异常情况确认:acknowledge=“auto”,(这种方式使用麻烦,不作讲解)
其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。
但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。
如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。
步骤
1、配置文件配置扫描监听器的包,监听器绑定要监听的队列——设置确认方式
2、编写监听器类
@Component
public class AckListener implements ChannelAwareMessageListener {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
Thread.sleep(1000);
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
System.out.println(new String(message.getBody()));
int i=3/0;
System.out.println("处理业务逻辑");
//手动签收
channel.basicAck(deliveryTag,true);
}catch (Exception e){
channel.basicNack(deliveryTag,true,true);
}
}
}
作用:在配置文件中已经配置关联了监听器,当项目一运行监听器就开始,
监听到队列后就进行相应的代码操作,无异常执行 channel.basicAck(deliveryTag,true);
手动签收消息,直观感受就是队列的消息被取出;
有异常执行channel.basicNack(deliveryTag,true,true);消息返回队列,当异常处理完成后,
执行 channel.basicAck(deliveryTag,true);这就完成了消息的传递。