【RabbitMQ、Spring Boot】Spring Boot整合RabbitMQ消息确认机制

本文介绍了如何在SpringBoot中整合RabbitMQ实现消息确认机制,包括生产者和消费者的确认方式。生产者配置了发布确认模式,设置回调函数处理消息发送成功或失败的情况。消费者采用手动确认模式,处理消息处理完成后确认或否定消息。同时,通过示例展示了模拟消息发送失败和队列投递失败的场景及其回调处理。
摘要由CSDN通过智能技术生成

一、确认流程

在这里插入图片描述

二、Spring Boot整合RabbitMQ消息确认机制

1、生产者确认

application.yml配置文件配置

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 7006
    username: admin
    password: admin
    # 是否触发回调方法
    # NONE值是禁用发布确认模式,是默认值
    # CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例
    # SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
    publisher-confirm-type: correlated
    publisher-returns: true
    listener:
      simple:
        # 开启手动确定
        acknowledge-mode: manual

设置消息发送到交换机时的回调函数 + 消息从交换机发送到队列时失败的回调函数

package com.cyun.demo.rabbitmq.provider.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 确认机制(消息发送到服务回调)
 *
 * @author He PanFu
 * @date 2022-04-16 18:29:03
 */
@Component
public class RabbitmqSendCallback implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void run() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        if (b) {
            System.out.println("消息发送成功");
        } else {
            System.out.println("消息发送失败,进行容错处理");
        }
        System.out.println("消息发送到交换机时的回调函数, ack:" + b + "  消息体:" + s);
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("消息从交换机发送到队列时失败的回调函数, 调用失败!!!");
    }
}

模拟消息发送到交换机失败(发布/订阅模式)

  • 修改发送消息的交换机为错误交换机
    在这里插入图片描述
  • 结果
    在这里插入图片描述

模拟消息从交换机发送到队列时失败(简单模式)

  • 修改发送消息的队列为错误交换机
    在这里插入图片描述
  • 结果
    在这里插入图片描述

2、消费者确认

代码

package com.cyun.demo.rabbitmq.consumer;

import com.rabbitmq.client.Channel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

/**
 * 简单模式:队列监听
 *
 * @author He PanFu
 * @date 2022-04-14 16:24:20
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class RabbitmqSimpleListener {

    int i = 0;

    @RabbitListener(queues = "simple_queue")
    public void messageListener(Map messageMap, Channel channel, Message message) throws InterruptedException, IOException {
        try {
            // 模拟业务出错
            if (i++ % 3 == 0) {
                int i = 0 / 0;
            }
            // TimeUnit.SECONDS.sleep(2);
            log.info("消息处理完成,消息内容:{}", messageMap);
            // 进行手动确定
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
        } catch (Exception e) {
            log.info("消息处理失败,消息内容:{}", messageMap);
            // 消息被否定。multiple:是否批量处理.true:将一次性ack所有小于deliveryTag的消息,requeue:为true时,重新入队
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
            e.printStackTrace();
        }
    }
}

参考链接:
RabbitMQ系列之消息确认机制
Spring Boot整合RabbitMQ——生产者发送确认

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值