rabbitmq消息队列 ack机制(消息确认机制)和消息补偿机制

参考:https://blog.csdn.net/pan_junbiao/article/details/112956537

ack 机制就是消息在 生产者在发布消息以后,消息存在内存中,如果消息被确认就会删除内存中消息。

在rabbitMq中 设置2种消息确认模式

1:自动确认 :RabbitMq种默认的确认模式 自动确认模式下,当 Broker (消息队列服务器实体)成功发送消息给消费者后就会立即把此消息从队列中删除,而不用 等待消费者回送确认消息。

2:手动确认。而在手动确认模式下,当 Broker (消息队列服务器实体) 发送消息给消费者后并不会立即把 此消息删除, 而是要等收到消费者回送的确认消息后才会删除,因此当消费者收到消息已经会发送一个ACK命令指消息确认给发送者,如果消费者因为意外崩溃而没有 发送 ACK 指令, 那么 Broker (消息队列服务器实体) 就会把该消息转发给其他消费者(如果此时没有其他消费者,则 Broker(消息队列服务器实体) 会缓存此消息, 直到有新的消费者注册)。

消息确认模式的实现实际上就是为了保险起见,在消息错误的时候做出一些处理。

消息确认可以在,提供了2个接口,一个在交换机回调,一个在发送到路由的时候回调

继承的接口 confirmCallBack ,returnCallBack 实现的方法 就是confirm和 returnMessage 2个方法

实现如图

 /**
     * 生产者 发送到exchange后,回调
     * @param correlationData 消息相关的数据,一般用于获取 唯一标识 id
     * @param ack true 消息确认成功,false 失败
     * @param cause 确认失败的原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.info("---confirm---ack={}, cause={}", ack, cause);
        log.info("correlationData-->{}", correlationData.toString());
        if (ack) {
            log.info("confirm消息确认成功");
        } else {
         

  /**
     * 生产者 找不到路由,触发
     * @param message 消息的相关信息
     * @param replyCode 错误状态码
     * @param replyText 错误状态码对应的文本信息
     * @param exchange 交换机的名字
     * @param routingKey 路由的key
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.info("---returnedMessage---replyCode={}, replyText={}, exchange={}, routingKey={}", replyCode, replyText, exchange, routingKey);
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值