一. 什么是生产端 confirm确认机制
消息确认的理解:是指生产者投递消息后, 如果Broker收到消息, 则会给我们产生一个应答,生产者进行接收应答, 用来确定这条消息是否正常发送到Broker, 这种方式也是消息的可靠性投递的核心保障
二. 在生产端实现confirm确认机制
- 在channel上开启确认模式 : channel.confirmSelect()
- 在channel上添加监听 : addConfirmListener, 监听成功和失败的返回结果, 根据具体的结果对消息进行重新发送, 或记录日志等后续处理
//添加一个确认监听
channel.addConfirmListener(new ConfirmListener() {
@Override //失败
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.err.println("-------no ack!-----------");
}
@Override //成功
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.err.println("-------ack!-----------");
}
});
三.生产端return消息机制
- Return Listener用于处理一些不可路由的消息
- 正常情况下消息生产者通过指定一个Exchange和RoutingKey, 把消息送到某一个队列中去, 然后消费者监听队列, 进行消费操作
- 但在某些情况下, 如果在发送消息的时候, 当前的exchange不存在或者指定的路由key路由不到, 这个时候如果我们需要监听这种不可达的消息, 就要使用Return Listener
- 在基础API中有一个关键的配置项Mandatory : 如果为true, 则监听器会接收到路由不可达的消息, 然后进行后续处理, 如果为false, 那么broker端自动删除该消息
//添加的return消息机制
channel.addReturnListener((replyCode, replyText, exchange1, routingKey1, properties, body) -> {
System.out.println("——handle return——");
System.out.println("replyCode:" + replyCode);
System.out.println("replyText:" + replyText);
System.out.println("exchange1:" + exchange1);
System.out.println("routingKey1:" + routingKey1);
System.out.println("properties:" + properties);
System.out.println("body:" + new String(body));
});