确认分为三种:单个确认、批量确认、异步确认
0.信道工具类
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RabbitMqUtils {
public static Channel getChannel() throws Exception {
// 创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 工厂IP
factory.setHost("192.168.112.220");
// rabbitmq 用户名
factory.setUsername("admin");
// 密码
factory.setPassword("123");
// 创建一个连接
Connection connection = factory.newConnection();
// 获取信道
Channel channel = connection.createChannel();
return channel;
}
}
1.单个确认
import com.rabbitmq.client.Channel;
import com.zym.rabbitmq.utils.RabbitMqUtils;
import java.util.UUID;
/**
* 单个确认发布
*/
public class Confirm01 {
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
String queueName = UUID.randomUUID().toString();
channel.queueDeclare(queueName, true, false, false, null);
//开启发布确认
channel.confirmSelect();
long startTime = System.currentTimeMillis();
// 模拟发送一千条消息
for (int i=0 ; i<1000; i++){
String message = i+"";
channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));
// 消息发送完立即确认
boolean flag = channel.waitForConfirms();
if(flag){
System.out.println("消息发送成功");
}
}
long endTime = System.currentTimeMillis();
System.out.println("单个确认所耗时间(毫秒)---->"+(endTime-startTime));
}
}
结果
2.批量确认
import com.rabbitmq.client.Channel;
import com.zym.rabbitmq.utils.RabbitMqUtils;
import java.util.UUID;
/**
* 批量确认发布
*/
public class Confirm02 {
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
String queueName = UUID.randomUUID().toString();
channel.queueDeclare(queueName, true, false, false, null);
//开启发布确认
channel.confirmSelect();
// 批量确认消息大小 模拟100个消息确认一次
int batchSize = 100;
// 等待消息确认个数
int waitingSize = 0;
long startTime = System.currentTimeMillis();
// 模拟发送一千条消息
for (int i=1 ; i<1001; i++){
String message = i+"";
channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));
waitingSize++;
if(waitingSize == batchSize){
//消息确认
channel.waitForConfirms();
waitingSize = 0;
}
}
long endTime = System.currentTimeMillis();
System.out.println("批量确认所耗时间(毫秒)---->"+(endTime-startTime));
}
}
结果
3.异步确认
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConfirmCallback;
import com.zym.rabbitmq.utils.RabbitMqUtils;
import java.util.UUID;
/**
* 异步确认发布
*/
public class Confirm03 {
public static void main(String[] args) throws Exception {
Channel channel = RabbitMqUtils.getChannel();
String queueName = UUID.randomUUID().toString();
channel.queueDeclare(queueName, true, false, false, null);
//开启发布确认
channel.confirmSelect();
long startTime = System.currentTimeMillis();
ConfirmCallback ackCallback = (sequenceNumber, multiple) -> {
System.out.println("确认成功的消息序号:"+sequenceNumber);
};
ConfirmCallback nackCallback = (sequenceNumber, multiple) -> {
System.out.println("确认失败的消息序号:"+sequenceNumber);
};
// 消息监听器,第一个参数:消息发送成功确认,第二个参数:消息发送失败确认
channel.addConfirmListener(ackCallback,nackCallback);
// 模拟发送一千条消息
for (int i=1 ; i<1001; i++){
String message = i+"";
channel.basicPublish("",queueName,null,message.getBytes("UTF-8"));
}
long endTime = System.currentTimeMillis();
System.out.println("异步确认所耗时间(毫秒)---->"+(endTime-startTime));
}
}
结果:
总结:异步确认 60ms 批量确认 119ms 单个确认 632ms