SpringBoot如何整合RabbitMQ

2023-05-16

[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007

文章目录

  • 概述
  • rabbitmq简介
  • SpringBoot整合
    • 安装rabbitmq
    • 初级用法
    • 高级用法
      • 配置交换器与队列
      • 发送消息
      • 消费消息
      • 测试
  • 总结

概述

好久没有写博客了,终日忙于生计,真是人过30不如狗啊,但写点什么好呢?想想当年自己入门时候那痛苦的经历,还是写点优质实用的入门文章吧,既满足了自己好为人师的本性,也能给后辈提供一些帮助。今天咱们就来聊聊springboot 整合rabbitmq的那些事吧。

SpringBoot的风头之盛不多说了,我是在2016年首次接触springboot的,当时自己要写个APP,后台采用了springboot。当时还真是个新鲜事物,没想到以后几年的发展犹如黄河泛滥,一发不可收拾…

SpringBoot整合rabbitmq很容易,但是整合的目的是为了使用,那要使用rabbitmq就要对其有一定的了解,不然容易整成一团浆糊。因为说到底,SpringBoot只是在封装rabbitmq的API,让其更容易使用而已,废话不多说,让我们一起整它。

rabbitmq简介

能看到这里就证明你对这个兔子有一定的了解了,如果真不知道rabbitmq官网走一趟,我这里就不啰嗦了。这里介绍的内容只是为了接下来整合使用做铺垫。

入门的话,大体理解了下图即可。

在这里插入图片描述

如图所示,producer产生一条消息,先丢给一个叫Exchange(交换器)的东西,然后交换器再将消息丢给Queue(队列),最后Consumer去队列获取消息。在我第一次听说rabbitmq的时候我脑子里面完全没有Exchange这玩意的概念,想当然的认为生产者将消息直接就丢给队列了,可见万事开头难。 Rabbit就是依靠Exchange把消息投递这个事玩出了花…

下面看一下关键的概念,不理解这些概念,在具体的使用过程中就会举步维艰

  • Producer 生产者
  • Consumer 消费者
  • Exchange 交换器

这个家伙又分4种,这里只看经常使用的两种即可,等你入了门,遇到时候再自己摸索吧。

Direct Exchange: 直接交换器,生产者将消息丢给它后,它从与自己绑定的那些queue里选择一个,然后直接将消息丢过去,其他的queue就接不到这个消息了。

Topic Exchange: 主题交换器,生产者将消息丢给它后,它就给与自己绑定的那些个关心这个消息queue全部发送一份消息。 就简单理解成发布-订阅模式就好了。

  • Queue 队列
  • RoutingKey路由key:用来控制交换器如何将消息发送给绑定的队列。例如交换器说了:俺们只投递路由key包含“shusheng007”字样的消息,其他的俺们不处理。 然后来了条消息,这条消息的路由key是“王二狗”,然后交换器一看不对啊,就残忍的拒绝了投递消息到队列的工作。

SpringBoot整合

SB整合其他技术一般就是3步,rabbit也不例外:

  • 引入依赖
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
 </dependency>

有的同学要问了,为什么不写版本号<version>版本号</version>,这是因为版本号被springboot给管理了,这块有时间可以写一篇新的博客。

  • 配置

引入依赖后一般情况下都需要做点配置,给你刚引入的技术提供一些必要的信息它才能正常的运行起来。例如这里的rabbitmq,你至少要告诉它运行消息队列的服务器地址和端口吧,这样程序才能连接。

在我们的配置文件application.yml中加入如下配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

如果引入的是starter,都可以在application.yml里配置,当然你也可以自己写个配置类,使用代码来配置,这个就比较麻烦但也比较高级了。

@Configuration
public class RabbitConfig {
    ...
}
  • 使用

第三步就是使用拉,本来各个技术使用方式各不相同,你要使用10种技术,你就要对这10种技术的API了然于胸,这对你幼小的心灵造成了不可磨灭伤害。此刻SB又站了出来,它使出洪荒之力为的是将各种技术的使用简化为统一的模式,于是各种各样的xxxTemplate就出来拉。

安装rabbitmq

  • 安装rabbitmq

你要使用rabbitmq你首先的有一个mq这没错吧,docker你该站出来拉…

docker run -d --hostname my-rabbit --name rabbit-mq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

不会docker的,面壁3分钟…, 上面的参数有一个需要重点提一下

--hostname my-rabbit

使用这个参数显式指定消息实际存放的地方。

  • 查看后台

rabbitmq很贴心的为我们提供了一个web管理后台, 当安装成功后,访问http://localhost:15672,输入默认的用户名和密码guest。端口号15672是我们上面使用docker安装时指定的。

在这里插入图片描述
登录成功后就会进入其后台管理页面,如下图所示。至于里面是什么自己摸索吧。
在这里插入图片描述

初级用法

让我们由浅入深的来实践一下,编程这玩意其实是最无脑的,特别是做应用层码工的,一个技术规定是啥样就是啥样,而且是可验证的,没什么玄学。例如你问为什么rabbitmq的默认端口号是5672啊?有可能是作者手机号的后四位,有可能是女朋友的某几个三围…who知道,who关心?你不喜欢,换掉就好啦,它就是这么规定的,你自己写一个,爱使用哪个使用哪个…扯远了

如何消费消息

  • 开启rabbitmq

使用注解@EnableRabbit来声明开启,其可放在Application上,也可以放在你自己写的rabbit配置类上。

@EnableRabbit
@SpringBootApplication
public class RabbitmqIntegrateApplication {
	...
}
  • 监听消费消息

这个也比较简单了,使用@RabbitListener注解即可。

@Slf4j
@Service
public class QueueConsumer {
    @RabbitListener(queues = {"ss007"})
    public void receive(@Payload String fileBody) {
        log.info("ss007队列:" + fileBody);
    }
}

上面的代码在监听ss007队列,只要这个队列里面存在消息,它就会消费。

经过上面两步就成功完成了一个rabbitmq消费消息的程序了,是不是很简单啊。现在你同事告诉你他往某个队列里面发消息,让你去写个消费程序,你可以自信的喊出那句:no problem!

值得注意的一点是,这样写要求ss007这个队列提前创建好了,不然会报错。我们打开rabbitmq的管理后台,按照下图红框展示那样添加一个队列。只填写名称ss007其他的都使用默认值即可,最后在绿框那边就会出现你创建的队列了,是不是特别简单。

在这里插入图片描述

然后点击新创建的队列名称,进入队列详情页。可以看到目前ss007这个队列有0个消费者。
在这里插入图片描述
让我们运行我们的程序后,刷新一下页面,可见已经有一个消费者了。

在这里插入图片描述

接下来了,让我们向队列里发送一个消息,点击Publish message选项展开,然后在payload里面填上消息内容,点击下面的publish即可。
在这里插入图片描述
看一下我们程序的输出:

xxxxxxxxxxxxxxx  INFO 99749 --- [ntContainer#0-1] t.s.rabbitmqintegrate.mq.QueueConsumer   : ss007队列:号外,号外,滴滴被罚80亿...

至此你已经成功完成了消息的消费开发验证。

如何发送消息

与消费消息相比,发送消息相对来说比较复杂一点,假设我们向刚才已经建立的队列ss007丢消息要怎么做呢?

第一步先创建一个队列对象myQuesue。

@Configuration
public class RabbitConfig {
    @Bean
    public Queue myQueue(){
        return new Queue("ss007",true);
    }
}

第二步,使用RabbitTemplate向myQueue队列里面发送消息

@RequiredArgsConstructor
@Service
public class SendService {

   private final RabbitTemplate rabbitTemplate;
   private final Queue myQueue;

   public void sendMsg(String msg){
      rabbitTemplate.convertAndSend(myQueue.getName(),msg);
   }
}

我们来写一个controller,然后使用postman发触发一下消息发送。

@RequiredArgsConstructor
@RestController
@RequestMapping("/trigger")
public class TriggerController {
    private final SendService sendService;
    @GetMapping("/send")
    public String sendMsgToMq(@RequestParam String msg){
        sendService.sendMsg(msg);
        return "ok";
    }
}

程序输出如下:

xxxxxxxxxxxxxxxx  INFO 13185 --- [ntContainer#0-1] t.s.rabbitmqintegrate.mq.QueueConsumer   : ss007队列:hello world

可见,我们刚向ss007队列发送了一条消息,这条消息就被我们刚才写的消费者给消费了。

至此,发送消息和消费消息都演示完了,请点赞,收藏…

what?就这?说好的Exchange呢?说好的Routing key呢?让你给偷摸造拉?好吧,好吧…现在的小朋友已经很难糊弄了,不见干货不点赞啊…

前面我们介绍Rabbitmq的时候说每个队列需要绑定到一个交换器上才能正常接收消息,但是我们好像没有定义交换器,也没有绑定任何交换器,这是怎么回事呢?

其实是因为,rabbitmq有一个默认的Exchange,而每个队列都会默认绑定它。所以我们前面的演示使用的是默认Exchange,它是一个direct类型的交换器,如下图所示。

在这里插入图片描述
那routing key我们也没指定啊,默认Exchange使用哪个路由key呢? 默认队列名称作为路由key,也就是ss007

高级用法

上面那些呢写写demo是没问题的,但在工程实践中一般还是推荐显式指定Exchange以及RoutingKey的。我们以topic类型的Exchange来看下。

配置交换器与队列

@Configuration
public class RabbitConfig {

    @Bean
    public Queue topicQueue1(){
        return new Queue("topicQueue1",true);
    }

    @Bean
    public Queue topicQueue2(){
        return new Queue("topicQueue2",true);
    }

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }

    @Bean
    public Binding topicBinding1(){
        return BindingBuilder.bind(topicQueue1()).to(topicExchange())
                .with("ss007.id.*");
    }

    @Bean
    public Binding topicBinding2(){
        return BindingBuilder.bind(topicQueue2()).to(topicExchange())
                .with("ss007.name.*");
    }
}

上面的代码创建了一个Exchange,两个队列,并将这两个队列绑定到了那个Exchange上。注意两个绑定使用的routingkey是不一样的。

发送消息

   public void sendTopicMsg(String msg,String route){
      rabbitTemplate.convertAndSend("topicExchange",route,msg);
   }

第一个参数是我们上一步配置的交换器,第二个参数是routingkey,第三个参数是消息

消费消息

    @RabbitListener(queues = {"topicQueue1"})
    public void receiveTopic1(@Payload String fileBody) {
        log.info("topic1队列:" + fileBody);
    }

    @RabbitListener(queues = {"topicQueue2"})
    public void receiveTopic2(@Payload String fileBody) {
        log.info("topic2队列:" + fileBody);
    }

监听并消费topicQueue1与topicQueue2队列的消息。

经过以上三步我们就完成了发送和消费消息的流程,启动程序后,让我们看一下rabbit的后台,赫然出现了我们创建的这些信息。从图中看到topicExchange已经生成,类型是Topic,而且生成了两个队列topicQueue1与topicQueue2,这个Exchange绑定了两个队列

在这里插入图片描述

测试

让我们实际测试一下:

使用postman发起get请求,使用路由字段为ss007.牛翠花.觉醒

localhost:8080/trigger/sendTopic?msg=牛翠花-总有刁民想害朕&route=ss007.牛翠花.觉醒

查看程序输出:

topic2队列:牛翠花-总有刁民想害朕

我们向交换器发送了一条消息,路由key是ss007.牛翠花.觉醒,它匹配到了我们topicBinding2的路由key:ss007.*.觉醒,而没有匹配到topicBinding1的路由key:ss007.王二狗.觉醒,所以只有topicQueue2里丢入了消息。

使用postman再发起一个get请求,这次使用路由字段为ss007.王二狗.觉醒

localhost:8080/trigger/sendTopic?msg=王二狗-王侯将相宁有种乎&route=ss007.王二狗.觉醒

输出:

topic2队列:王二狗-王侯将相宁有种乎
topic1队列:王二狗-王侯将相宁有种乎

可见,两个队列里面都被丢入了同样的消息。这是为什么呢?这是由于我们使用的是Topic类型的交换器,而且路由key可以匹配到两个队列的绑定。

总结

至此,你以为本文真的要结束了?

嗯…就让我们结束它吧,都这么长了。留下一个使用SpringCloud-Stream来使用rabbitmq的话题下次再讲,它将抽象又提升了一个等级,我觉得这哥们是未来…请持续关注

下面是本文源码,记得给个小星星哦

GitHub源码下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot如何整合RabbitMQ 的相关文章

  • 结束,也是开始。

    三年时光转眼即逝 xff0c 临到毕业才幡然醒悟 xff0c 自己掌握的专业技能太少 xff0c 最后几个月才养成了几个好习惯 在上班利用空闲时间多学学其他的技术 xff0c 希望自己可以不停的努力 xff0c 充实自己的每一天
  • 论 "张筱雨"

    当今网络谁最红 xff1f 当今网络谁最裸 xff1f 当今网络谁征服了大多数男人们的眼球 xff1f 当今网络谁最具创新 xff0c 引领时尚潮流 xff0c 当今网络谁敢和日本AV女优叫板 那么她就是 张筱雨 张筱雨 xff01 xff
  • Linux的多用户登录

    1 Windows只允许在同一时刻只有一个用户登录 xff0c 而Linux允许多用户同时登录 2 在Linux下 xff0c 用户有两种登录模式 一种是 图形界面登录 xff0c 类似于Windows 另一种是 文本登录 xff0c 类似
  • URI encode与URL encode对空格的不同处理

    在各种开放平台 OpenAPI越来越多之时 xff0c 客户端软件或多或少的在通过HTTP HTTPS协议与服务器交互 这其中一个常见的情况就是要求对URL进行encode处理 xff0c 以保证中文 特殊字符的正确传递 不过这个小小的en
  • No plugin found for prefix 'install' in the current project解决方案

    本来以下配置 xff0c 报上面的错 lt mirrors gt lt mirror Specifies a repository mirror site to use instead of a given repository The r
  • android的onNewIntent

    1 onNewIntent Intent intent 是Activity类的方法 它被调用发几种情况如下 lt activity android name 61 34 NewIntentDemo 34 android label 61 3
  • 全网火爆,JMeter性能测试-压力负载测试场景(总结)看这一篇足够了......

    目录 xff1a 导读 前言一 Python编程入门到精通二 接口自动化项目实战三 Web自动化项目实战四 App自动化项目实战五 一线大厂简历六 测试开发DevOps体系七 常用自动化测试工具八 JMeter性能测试九 总结 xff08
  • Linux LVM在线扩容xfs文件系统(创建大于2T的磁盘分区)

    1 使用parted方式格式化磁盘 1 1 查看磁盘情况 root 64 superman fdisk l Disk dev sdd 2199 0 GB 2199023255552 bytes 4294967296 sectors Unit
  • Linux LVM在线扩容ext3文件系统

    1 扩容前信息查看 1 2 查看文件系统情况 root 64 superman df h 文件系统 容量 已用 可用 已用 挂载点 dev mapper VG00 lv root 30G 23G 5 3G 82 dev mapper VG0
  • Linux云计算-04_Linux用户及权限管理

    Linux是一个多用户的操作系统 xff0c 引入用户 xff0c 可以更加方便管理Linux服务器 xff0c 系统默认需要以一个用户的身份登录 xff0c 而且在系统上启动进程也需要以一个用户身份器运行 xff0c 用户可以限制某些进程
  • 01 openEuler操作系统介绍

    文章目录 01 openEuler操作系统介绍1 1 发布件1 2 最小硬件要求1 3 硬件兼容性1 4 关键特性1 4 1 openEuler 22 03 LTS基于 Linux Kernel 5 10 内核构建 在进程调度 内存管理等方
  • 02 openEuler操作系统的安装

    文章目录 02 openEuler操作系统的安装2 1 openEuler操作系统的安装流程2 2 openEuler操作系统的安装详细步骤2 2 1 下载地址2 2 2 创建虚拟机2 2 2 1 方法一 xff1a 典型配置2 2 2 2
  • 06 openEuler XFCE 桌面环境的安装和使用

    06 openEuler XFCE 桌面环境的安装和使用 文章目录 06 openEuler XFCE 桌面环境的安装和使用6 1 XFCE简介6 2 XFCE安装方法6 2 1 更新软件源6 2 2 安装字库6 2 3 安装Xorg6 2
  • 21 openEuler 管理服务-改变运行级别

    文章目录 21 管理服务 改变运行级别21 1 Target和运行级别21 2 查看系统默认启动目标21 3 查看当前系统所有的启动目标21 4 改变默认目标21 5 改变当前目标21 6 切换到救援模式21 7 切换到紧急模式 21 管理
  • 字符串通配(动态规划java)

    1 牛客网题目 xff1a 题目描述 对于字符串A xff0c 其中绝对不含有字符 和 再给定字符串B xff0c 其中可以含有 或 xff0c 字符不能是B的首字符 xff0c 并且任意两个 字符不相邻 exp中的 代表任何一个字符 xf
  • 26 openEuler管理网络-使用ip命令配置网络

    文章目录 26 openEuler管理网络 使用ip命令配置网络26 1 配置IP地址26 1 1 配置静态地址26 1 2 配置多个地址 26 2 配置静态路由 26 openEuler管理网络 使用ip命令配置网络 说明 xff1a 使
  • 31 openEuler使用LVM管理硬盘-管理物理卷

    文章目录 31 openEuler使用LVM管理硬盘 管理物理卷31 1 创建物理卷31 2 查看物理卷31 3 修改物理卷属性31 4 删除物理卷 31 openEuler使用LVM管理硬盘 管理物理卷 31 1 创建物理卷 可在root
  • 41 openEuler搭建FTP服务器-传输文件

    文章目录 41 openEuler搭建FTP服务器 传输文件41 1 概述41 2 连接服务器41 3 下载文件41 4 上传文件41 5 删除文件41 6 断开服务器 41 openEuler搭建FTP服务器 传输文件 41 1 概述 这
  • 45 openEuler搭建Nginx服务器-Nginx概述和安装

    文章目录 45 openEuler搭建Nginx服务器 Nginx概述和安装45 1 概述45 2 安装 45 openEuler搭建Nginx服务器 Nginx概述和安装 45 1 概述 Nginx 是一款轻量级的 Web 服务器 反向代
  • 14 KVM虚拟机配置-配置虚拟设备(其它常用设备)

    文章目录 14 KVM虚拟机配置 配置虚拟设备 xff08 其它常用设备 xff09 14 1 概述14 2 元素介绍14 3 配置示例 14 KVM虚拟机配置 配置虚拟设备 xff08 其它常用设备 xff09 14 1 概述 除存储设备

随机推荐

  • 15 KVM虚拟机配置-体系架构相关配置

    文章目录 15 KVM虚拟机配置 体系架构相关配置15 1 概述15 2 元素介绍15 3 AArch64架构配置示例15 4 x86 64架构配置示例 15 KVM虚拟机配置 体系架构相关配置 15 1 概述 XML中还有一部分体系架构相
  • 16 KVM虚拟机配置-其他常见配置项

    文章目录 16 KVM虚拟机配置 其他常见配置项16 1 概述16 2 元素介绍16 3 配置示例 16 KVM虚拟机配置 其他常见配置项 16 1 概述 除系统资源和虚拟设备外 xff0c XML配置文件还需要配置一些其他元素 xff0c
  • windows查看默认编码类型

    xfeff xfeff 开始 cmd 运行chcp 你会得到一个数 例 xff1a 如936 xff0c 那就是GBK简体中文 ANSI代码页为1252 xff0c 日文代码页为932
  • 三、@PathVariable

    3 1 64 PathVariable 映射 URL 绑定的占位符 带占位符的 URL 是 Spring3 0 新增的功能 xff0c 该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义通过 64 PathVari
  • 走进CSDN

    走进CSDN 关注CSDN不久 xff0c 最近浏览的次数增多 xff0c CSDN的资讯刚开始基本上看的懂的不多 xff0c 专业名词扎堆的论坛 xff0c CSDN的氛围个人感觉挺好的 xff0c 一群俗称 程序员 的人聚集讨论问题 x
  • B端产品经理基本工作流程

    产品岗位必备素质 产品是一个门槛较低的岗位 xff0c 是一个看起来很容易 xff0c 做起来各个地方都是bug的岗位 产品需要更多的是软实力 xff0c 把握产品的方向 xff0c 目标用户是谁 xff0c 场景是什么 xff0c 达到怎
  • Mac实用的远程ssh连接工具( Royal TSX安装及使用)

    Mac实用的远程ssh连接工具 Royal TSX安装及使用 1 下载地址 https www royalapps com ts mac download 2 如何连接远程服务器 2 1 首先下载插件Terminal 2 2 然后创建新的D
  • 尝试VC控制外部程序

    这两天尝试VC控制外部程序呢 xff0c 慢慢完善 在参考了网络学习以后 xff0c 简单做了以下工作 xff1a 期间用了spy 43 43 器件 void CVCControlDlg OnStartreader 启动朗读女 TODO A
  • Windows Sever 2012 R2设置组策略对“不显示最后的登录名”选项已启用

    Windows Sever 2012 R2设置组策略对 不显示最后的登录名 选项已启用 作者 xff1a 我道梦 关注我的CSDN博客 xff0c 更多笔记知识还在更新 xff01 设置组策略启用 不显示最后的登录名 后 xff0c 系统将
  • Ubuntu22.04.1 & WIN11 双系统+双硬盘 grub启动项中无WIN11开机引导

    本机UEFI 43 GPT安装的双系统 xff0c 两块固态硬盘 xff0c 两个系统各自使用自己的硬盘分区 xff0c xff08 选择的全盘安装在新硬盘 xff0c 没有自定义分区 xff0c 所以安装的时候也没有提示与当前window
  • tightvnc,tightvnc软件介绍,详细介绍

    tightvnc一款用于windows操作系统的应用软件 xff0c 是一款远程控制软件 出门在外忘了带档案怎么办 xff1f FTP server 上头忘了开帐号怎么办 xff1f 这些麻烦的问题其实都可以靠 VNC 解决 tightvn
  • OpenCore-EFI-配置模版(持续更新)

    前言 随着OpenCore日臻完善 xff0c 将在以后会更多的用于黑苹果的安装 同时 xff0c 在各位大佬的大力支持与推广 xff0c 各种入门 xff0c 进阶教程的推出 xff0c OpenCore已经从神界降临到人间 逐渐为普通黑
  • OpenCore(OC)引导开机声音与图形界面设置

    关键字 xff1a OC xff1b OpenCore xff1b 引导 xff1b 开机声音 xff1b 图形界面 下面的设置基于OpenCore0 5 8 04 10编译版与1 22 0 0版OpenCore Configurator
  • The BMJ研究:现有的新冠病毒诊断AI模型,几乎毫无用处

    图片出处 xff1a unsplash 本文作者 xff1a 朱演瑞 新型冠状病毒对全球健康造成了严重的威胁 xff0c 为了减轻医疗保健系统的负担 xff0c 也给患者提供最佳的护理 xff0c 高效的诊断和疾病预后信息问题亟待解决 理论
  • 06-Docker-Centos 7.2 (Vmware最小化安装)之一篇搞定hyperledger/fabric的e2e_cli测试运行所遇到的ERROR总结

    bug产生原因分析如下 xff1a 1 系统过于单纯或复杂 xff08 即最小化安装与全部安装以及自行安装了很多软件 xff09 xff0c 很多命令和工具无法使用和执行或冲突 2 自己操作失误 xff0c 敲错代码 xff08 关键词和语
  • 秒懂Java之方法引用(method reference)详解

    版权申明 非商业目的注明出处可自由转载 出自 xff1a shusheng007 相关文章 xff1a 秒懂Java之深入理解Lambda表达式 文章目录 概述使用条件使用场景如何使用方法引用的类型调用类的静态方法调用传入的实例参数的方法调
  • 产品设计中关于思考力那些事

    这周的面试 xff0c 对我自己来说 xff0c 更像是一种迭代反思 从做什么怎么做 xff0c 到为什么做 xff0c 的一种强制思考 一方面是入行时间短 xff0c 另一方面是公司产品业务主导 xff0c 相对不需要产品去思考 xff0
  • 永不磨灭的设计模式(有这一篇真够了,拒绝标题党)

    版权申明 非商业目的注明出处可自由转载 出自 xff1a shusheng007 文章目录 概述定义分类创建型 xff08 creational xff09 结构型 xff08 structural xff09 行为型 xff08 beha
  • shusheng007编程手记

    版权申明 非商业目的注明出处可自由转载 出自 xff1a shusheng007 文章目录 概述工具篇IntelliJ IDEA在Idea中下载源码时 xff0c 报无法下载源码 Postman使用Postman发送Post请求服务端报得到
  • SpringBoot如何整合RabbitMQ

    版权申明 非商业目的注明出处可自由转载 出自 xff1a shusheng007 文章目录 概述rabbitmq简介SpringBoot整合安装rabbitmq初级用法高级用法配置交换器与队列发送消息消费消息测试 总结 概述 好久没有写博客