ConcurrentSkipListMap 和 channel.getNextPublishSeqNo()
channel.getNextPublishSeqNo
可以获取发布的消息的下一个序号,有序递增。ConcurrentSkipListMap有一个heapMap
方法,可以返回key小于等于param的map子集。在发布消息之前先获取序号,作为key放到map里面。
map.put(nextPublishSeqNo, byteMsg);
channel.basicPublish("", queueName, null, msgStr.substring(i, i + 1).getBytes(StandardCharsets.UTF_8));
异步确认
Producer只管发消息,然后注册一个异步回调函数。rabbitmq提供了两个回调函数。一个是发送成功的回调,一个是发送失败的回调。两个函数的参数是一样的,两个。
- sequence number 序号。表示成功/失败的消息编号
- multiple 布尔值。false表示只有一个被确认。true表示小于等于当前序号的消息发送成功/失败
channel.confirmSelect();//启用消息确认
channel.addConfirmListener(
(deliveryTag, multiple) -> {
if (multiple) {
System.out.println("序号" + deliveryTag + "的信息发送成功");
map.remove(deliveryTag);
} else {
System.out.println("序号小于" + deliveryTag + "的信息发送成功");
final ConcurrentNavigableMap<Long, Byte> confirmed = map.headMap(deliveryTag, true);
confirmed.clear();
}
},
(deliveryTag, multiple) -> {
if (!multiple) {
System.out.println("发送失败的信息sequence number:" + deliveryTag);
} else {
System.out.println("序号小于" + deliveryTag + "的消息发送失败");
}
});