RabbitMQ发布消息之异步确认

生产者可以大量发消息,消息的确认异步处理。最佳性能和资源使用,在出现错误的情况下可以很好地控制,但是实现起来稍微难些

 引入maven依赖

 com.rabbitmqamqp-client5.8.0commons-iocommons-io2.6
//异步确认public static void publishAsync() throws Exception {Channel channel = RabbitMqUtils.getChannel();//开启确认发布channel.confirmSelect();String queuename = UUID.randomUUID().toString();//声明队列channel.queueDeclare(queuename, false, false, false, null);// 线程:适用于高并发的情况下,处理未确认的消息// 轻松将序号与消息进行关联// 轻松删除批量条目,只要给到序号ConcurrentSkipListMap outstandingConfirms = new ConcurrentSkipListMap<>();ConfirmCallback ackCallback = (deliveryTag, multiple) -> {// 2.删除已经确认的消息,剩下的就是未确认的消息if (multiple) {ConcurrentNavigableMap confirmed = outstandingConfirms.headMap(deliveryTag);confirmed.clear();} else {outstandingConfirms.remove(deliveryTag);}System.out.println("确认的消息" + deliveryTag);};ConfirmCallback nackCallback = (deliveryTag, multiple) -> {// 打印未确认的消息String message = outstandingConfirms.get(deliveryTag);System.out.println("未确认的消息是" + message + "---》未确认消息的编号" + deliveryTag);};//设置异步确认监听器channel.addConfirmListener(ackCallback, nackCallback);// 开始时间long l = System.currentTimeMillis();for (int i = 0; i < MESSAGE_COUNT; i++) {String message = i + "";channel.basicPublish("", queuename, null, message.getBytes());// 1. 记录一下消息的发布总量outstandingConfirms.put(channel.getNextPublishSeqNo(), message);}long end = System.currentTimeMillis();System.out.println("批量确认" + MESSAGE_COUNT + "条耗时" + (end - l) + "ms");}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部