RabbitMQ发布确认高级版

在这里插入图片描述在这里插入图片描述

2.添加配置信息

在application.properties文件中添加如下配置,交换机开启消息确认模式

#NONE 值是禁用发布确认模式,是默认值
#CORRELATED 值是发布消息成功到交换器后会触发回调方法
#SIMPLE 值经测试有两种效果,其一效果和 CORRELATED 值一样会触发回调方法,
# 其二在发布消息成功后使用 rabbitTemplate 调用 waitForConfirms 或 waitForConfirmsOrDie 方法等待 broker 节点返回发送结果,
# 根据返回结果来判定下一步的逻辑,要注意的点是 waitForConfirmsOrDie 方法如果返回 false 则会关闭 channel,
# 则接下来无法发送消息到 broker;
spring.rabbitmq.publisher-confirm-type=correlated

  • NONE 值是禁用发布确认模式,是默认值
  • CORRELATED 值是发布消息成功到交换器后会触发回调方法
  • SIMPLE 值经测试有两种效果,其一效果和 CORRELATED 值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate 调用waitForConfirms 或 waitForConfirmsOrDie 方法等待 broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie 方法如果返回 false则会关闭 channel,则接下来无法发送消息到 broker;

3. 配置类

package com.hong.springboot.rabbitmq.config;

import org.springframework.amqp.core.\*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/\*\*
 \* @Description: 发布确认高级版配置类
 \* @Author: hong
 \* @Date: 2024-03-05 20:52
 \* @Version: 1.0
 \*\*/
@Configuration
public class ConfirmConfig {
    public static final String CONFIRM\_EXCHANGE\_NAME = "confirm.exchange";
    public static final String CONFIRM\_QUEUE\_NAME = "confirm.queue";
    public static final String CONFIRM\_ROUTING\_KEY = "key1";

    //声明业务 Exchange
    @Bean("confirmExchange")
    public DirectExchange confirmExchange() {
        return new DirectExchange(CONFIRM\_EXCHANGE\_NAME);
    }

    // 声明确认队列
    @Bean("confirmQueue")
    public Queue confirmQueue() {
        return QueueBuilder.durable(CONFIRM\_QUEUE\_NAME).build();
    }

    // 声明确认队列绑定关系
    @Bean
    public Binding queueBinding(@Qualifier("confirmQueue") Queue queue,
                                @Qualifier("confirmExchange") DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(CONFIRM\_ROUTING\_KEY);
    }
}

4.生产者

package com.hong.springboot.rabbitmq.controller;

import com.hong.springboot.rabbitmq.config.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;

/\*\*
 \* @Description: 发布确认高级版生产者
 \* @Author: hong
 \* @Date: 2024-03-05 20:58
 \* @Version: 1.0
 \*\*/
@Slf4j
@RequestMapping("/confirm/")
@RestController
public class ConfirmProducerController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    //http://localhost:8080/confirm/sendMsg/Hi,JAVA小生不才
    @GetMapping("sendMsg/{message}")
    public void sendMsg(@PathVariable String message) {
        log.info("当前时间:{},发送信息给队列:{}",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) , message);
        rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM\_EXCHANGE\_NAME, ConfirmConfig.CONFIRM\_ROUTING\_KEY, message);
    }
}

5.消费者

package com.hong.springboot.rabbitmq.consumer;

import com.hong.springboot.rabbitmq.config.ConfirmConfig;
import com.hong.springboot.rabbitmq.config.DelayedQueueConfig;
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.text.SimpleDateFormat;
import java.util.Date;

/\*\*
 \* @Description: 发布确认高级版消费者
 \* @Author: hong
 \* @Date: 2024-03-05 21:05
 \* @Version: 1.0
 \*\*/
@Slf4j
@Component
public class ConfirmConsumer {
    @RabbitListener(queues = ConfirmConfig.CONFIRM\_QUEUE\_NAME)
    public void receiveConfirmMessage(Message message){
        String msg = new String(message.getBody());
        log.info("当前时间:{},收到信息{}",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) , msg);
    }
}

正常情况下,发送http://localhost:8080/confirm/sendMsg/Hi,JAVA小生不才
在这里插入图片描述

6.回调接口

package com.hong.springboot.rabbitmq.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/\*\*
 \* @Description: 发布确认高级版消息生产者的回调接口
 \* @Author: hong
 \* @Date: 2024-03-09 21:58
 \* @Version: 1.0
 \*\*/
@Slf4j
@Component
public class MyCallBack implements RabbitTemplate.ConfirmCallback{
    @Autowired
    private RabbitTemplate rabbitTemplate;

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

    /\*\*
 \* 交换机不管是否收到消息的一个回调方法
 \* 1.收到消息
 \* correlationData 保存回调消息的id及相关信息
 \* b true 交换机收到消息
 \* s null
 \* 2.未收到消息
 \* correlationData 保存回调消息的id及相关信息
 \* b false 交换机未收到消息
 \* s 失败的原因
 \* @param correlationData 消息相关数据
 \* @param b 交换机是否收到消息
 \* @param s 没收到消息的原因
 \*/
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        String id = correlationData != null ? correlationData.getId() : "";
        if (b) {
            log.info("交换机已经收到id为:{}的消息", id);
        } else {
            log.info("交换机还未收到id为:{}消息,原因:{}", id, s);
        }
    }
}

修改ConfirmProducerController中sendMsg方法
交换机改个名字模拟交换机收不到消息

    @GetMapping("sendMsg/{message}")
    public void sendMsg(@PathVariable String message) {


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/7959ba44f1b8c9e4390e436d1b71e77e.png)
![img](https://img-blog.csdnimg.cn/img_convert/587afccb2a7c1d8e527c70158912a5db.png)
![img](https://img-blog.csdnimg.cn/img_convert/b3039a17cec35837ddfef18f8fab7f32.png)
![img](https://img-blog.csdnimg.cn/img_convert/31837fa9352e3a484ae1286f6f582c80.png)
![img](https://img-blog.csdnimg.cn/img_convert/a80f4be4bef49f0f54637e74fa827bff.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
![img](https://img-blog.csdnimg.cn/img_convert/815b29eb41e6bb8a09f9a7d69cb64710.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
[外链图片转存中...(img-YW2lRhek-1712858479275)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值