为什么要设置手动ack,消息确认
- 设置主动的主要作用是进行消息确认,
- 自动确认会在消息发送给消费者后立即确认,如果手动则当消费者调用ack,nack,reject几种方法时进行确认.
-
一般会设置手动模式,业务失败后可以进行一些操作.
//消息的标识,false只确认当前一个消息收到,true确认所有consumer获得的消息
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//ack返回false,并重新回到队列,api里面解释得很清楚
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
//拒绝消息
channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
如何设置手动ack
1,设置消费监听配置
acknowledge="manual"
<rabbit:listener-container
connection-factory="connectionFactory" acknowledge="manual">
<!-- queues 监听队列,多个用逗号分隔 ref 监听器 -->
<rabbit:listener queues="test_queue_key2" ref="Consumer2" />
</rabbit:listener-container>
2,实现ChannelAwareMessageListener 接口
package com.mq.rabbitmq;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
import com.rabbitmq.client.Channel;
public class ChannleConsumer implements ChannelAwareMessageListener {
@Override
public void onMessage(Message message, Channel channel) throws Exception {
try {
//消息的标识,false只确认当前一个消息收到,true确认所有consumer获得的消息
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
System.out.println("onMessage方法结束");
} catch (Exception e) {
//ack返回false,并重新回到队列,api里面解释得很清楚
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
e.printStackTrace();
System.out.println("onMessage方法异常结束");
}
}
}