只发生在consumer端,关闭autoAck, channel.basicQos(1);只发送一条。 channel.basicAck(envelope.getDeliveryTag(),false);一条一条手工确认,
package com.gavin.mq.autoack;
import com.gavin.utils.RabbitMQUtils;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class WorkConsumer {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = RabbitMQUtils.getConnection();
Channel channel = connection.createChannel();
/**
* 通道每次只能消费1个消息,不加这个默认消费者可以消费所有生产者发送的消息,比如消费5条,有可能消费者宕机丢失2条。
* 因此让能者多劳,换消费者2消费。
*/
channel.basicQos(1);
channel.queueDeclare("work",true,false,false,null);
channel.basicConsume("work",false,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(new String(body));
/**
* 参数1:手动确认标识,确定队列中的哪个具体的消息
* 参数2:是否开启多个消息同时手工确认。每次确认一个
*/
channel.basicAck(envelope.getDeliveryTag(),false);
}
});
}
}