异步确认虽然编程逻辑比上两个复杂,但是性价比最高,无论是可靠性还是效率都没得说,它是利用回调函数来达到消息可靠性传递的,这个中间件也是通过函数回调来保证是否投递成功。 private static final int SEND_COUNT = 1000;//总共发送多少条信息
/*
* 异步确认发布
* */
public static void publishMessageConfirmAsync() throws Exception{
//获取RabbitMQ连接
Channel rabbitMQConnectionChannel = RabbitMQUtil.getRabbitMQConnectionChannel();
//声明队列
String queueName = UUID.randomUUID().toString();
rabbitMQConnectionChannel.queueDeclare(queueName,false,false,false,null);
//开启发布确认
rabbitMQConnectionChannel.confirmSelect();
//异步确认发布开始时间
long startTime = System.currentTimeMillis();
//消息确认成功回调函数
ConfirmCallback confirmCallback = (deliveryTag, multiple) ->{
System.out.println("确认的消息:" + deliveryTag);
};
//消息确认失败回调函数
/*
* 1.消息的标记
* 2.是否为批量确认
* */
ConfirmCallback nackCallback = (deliveryTag, multiple) ->{
System.out.println("未确认的消息:" + deliveryTag);
};
//准备消息的监听器,监听哪些消息成功了,哪些消息未成功
/*
*1.监听哪些消息成功了
*2.监听哪些消息未成功
* */
rabbitMQConnectionChannel.addConfirmListener(confirmCallback,nackCallback);
//批量发消息
for (int i = 0; i < SEND_COUNT; i++) {
String message = i + "";
//发送消息
rabbitMQConnectionChannel.basicPublish("",queueName,null,message.getBytes());
}
//异步确认发布结束时间
long endTime = System.currentTimeMillis();
System.out.println("发送1000消息需要消耗:" + (endTime - startTime) +"ms");
//异步确认发布
publishMessageConfirmAsync();//发送1000消息需要消耗:44ms
|