SpringBoot如何整合RabbitMQ

[版权申明] 非商业目的注明出处可自由转载
出自: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: localhostport: 5672username: guestpassword: 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 {@Beanpublic 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 {@Beanpublic Queue topicQueue1(){return new Queue("topicQueue1",true);}@Beanpublic Queue topicQueue2(){return new Queue("topicQueue2",true);}@Beanpublic TopicExchange topicExchange(){return new TopicExchange("topicExchange");}@Beanpublic Binding topicBinding1(){return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with("ss007.id.*");}@Beanpublic 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源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16837.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《不要挑战人性》笔记(一)

恒河猴实验 代母实验 将刚出生的小猴子与母亲分开&#xff0c;让它与绒布妈妈跟铁丝妈妈生活在一起。铁丝妈妈身上有食物&#xff0c;绒布没有食物&#xff0c;小猴子更喜欢绒布妈妈&#xff0c;即使它在铁丝妈妈那里得到了食物。绒布妈妈身上设置机关&#xff0c;攻击小猴子&a…

2022年最新嘟嘟早教卡小程序源码+附带后台管理

源码说明 【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序&#xff0c;这里是后端源码&#xff0c;由 Laravel、Tailwind CSS 及 AlpineJS 构建而成。 关于项目 该项目包括了管理后台以及小程序接口,想法源于小时候玩的认知卡片&#xf…

go语言实现加减法出题器(再也不用担心孩子学习了)

需求&#xff1a;孩子做题需要我出题&#xff0c;我不想出。 为什么不用我熟悉的java&#xff0c;go可以直接生成exe文件。 Windows执行程序链接 set_quest.exe https://www.aliyundrive.com/s/yP3GuhTZoGD 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里…

计算机应用课程的专业建议,计算机应用技术专业课程衔接问题论文

计算机应用技术专业课程衔接问题论文 摘要&#xff1a;:对中高职教育来说&#xff0c;课程衔接是维系教育质量的关键。做好课程衔接不仅有助于推动职业教育的纵向发展&#xff0c;同时也能够提高学生的职业技能。现本文从中高职计算机专业课程衔接必要性探讨出发&#xff0c;分…

成长杂志成长杂志社成长编辑部2022年第7期目录

成长杂志成长杂志社成长编辑部2022年第7期目录 前沿视点 加强学校基建项目建设与管理工作的策略分析 (3) 陈志捷 新时代背景下高职院校新进教师师德师风建设机制探究 (6) 李硕 工匠精神培养与中职思想政治教育的融合探究 (9) 袁梅 数字经济时代高等教育面临的挑战及…

郑州鸿蒙学前班好吗,提前上学前班真的好吗?3个严重危害,值得家长深思

在杭州&#xff0c;一名老师对1000个家庭进行调查&#xff0c;发现上过幼小衔接班的孩子占了50.28%&#xff0c;超过一半。 上了幼小衔接班的孩子&#xff0c;在一年级时&#xff0c;学习尚有优势&#xff1b;到了二年级&#xff0c;他们中感到学业负担重的孩子&#xff0c;竟比…

中如何输入越南拼音_幼小衔接中,我们如何给孩子做拼音启蒙?

其实汉语拼音看似简单&#xff0c;但对不少孩子来说还是有难度的&#xff0c;主要体现在哪些方面呢&#xff1f; 发音不准 几个相似的声母记不住 不会拼读...... 除了以上这三点以外&#xff0c;学龄前孩子在掌握拼音的认读时&#xff0c;还要牢记各个声调的发音&#xff0c;并…

幼小衔接 测试 c语言,幼升小名校入学测试题含答案

幼升小名校入学测试题含答案 在各领域中&#xff0c;我们都要用到试题&#xff0c;借助试题可以检测考试者对某方面知识或技能的掌握程度。你知道什么样的试题才能切实地帮助到我们吗&#xff1f;下面是小编精心整理的幼升小名校入学测试题含答案&#xff0c;仅供参考&#xff…

孩子幼小衔接怎么做?猿辅导老师建议家长做好这些准备

每年到了这个时间&#xff0c;即将有一批小朋友告别幼儿园&#xff0c;成为小学生。家长和老师关于“幼小衔接”的担忧甚至焦虑也在蔓延。家长担心孩子入学之后遇到问题&#xff1a;“我家孩子不会拼音&#xff0c;万一跟不上怎么办&#xff1f;”“小学教学进度很快&#xff0…

入学准备幼小衔接c语言,【启航教育】做好幼小衔接 ——一年级新生入学准备攻略...

尊敬的各位家长&#xff1a;新的学年&#xff0c;桂江小学大家庭即将迎来一批活泼可爱的一年级小朋友&#xff0c;为了让孩子们尽快适应新的学习生活&#xff0c;请各位家长仔细阅读2019-2020学年第一学期一年级新生入学攻略! 1、认识我们的学校 桂江小学建校于2004年9月&#…

幼小衔接课程c语言,幼小衔接很重要,课程安排出来了!!!

原标题&#xff1a;幼小衔接很重要&#xff0c;课程安排出来了&#xff01;&#xff01;&#xff01; 幼小衔接是幼儿园和小学教育两个教育阶段的平稳过渡的教育过程&#xff0c;也是儿童成长过程的一个重大转折&#xff0c;这个阶段也是处于人类整个逻辑思维形成和使用过程中所…

鸿蒙幼小衔接怎么样,郑州市新元鸿蒙幼小衔接开展“拥抱自然 收获快乐” 户外大课堂实践活动...

秋天是美丽的季节&#xff0c;是丰收的季节&#xff0c;是处处都蕴涵着教育契机的季节&#xff0c;为了让孩子们走进大自然&#xff0c;寻找、体验秋天的美丽&#xff0c; 新元鸿蒙幼小衔的宝贝们在老师们的组织下举办了一次秋游挥动&#xff0c;萌娃们放下小书包&#xff0c;投…

预见未来:超强元AI诞生,抓住这个机会,利用AI变现也变得更加容易

目录 一、引言 二、介绍 三、技术展现 四、元AI架构图展现 五、元AI变现技巧—商业版说明 六、后期规划 一、引言 如何利用AI变现已经成为了当今各个行业亟需解决的问题。随着人工智能技术的快速发展和普及&#xff0c;越来越多的企业开始将其应用于产品研发、销售流程优化、客…

AI时代已经到来,不想被抛弃,特别是传统产业的你,怎么办?

由于ChatGTP的惊人表现&#xff0c;本来已经趋于平淡的AI&#xff0c;又火爆起来。毫无疑问&#xff0c;人类已经进入了AI时代&#xff0c;AI将渗入到各行各业&#xff0c;渗入到生活与工作的每个方面。这是一场新的工业革命&#xff0c;很多工作都将消失&#xff0c;但也会产生…

ChatGPT 王炸更新,新时代的操作系统来了

大家好&#xff0c;我是校长。 聊一点感慨吧。 昨天&#xff0c;OpenAI 宣布已经在 ChatGPT 中实现了对插件的初步支持。 插件 (Plugins) 是专门为语言模型设计的工具&#xff0c;以安全为核心原则&#xff0c;可帮助 ChatGPT 访问最新信息、运行计算或使用第三方服务。这意味着…

用LangChain实现一个ChatBlog

文章目录 前言环境一、构建知识库二、将知识库向量化三、召回四、利用LLM做阅读理解五、效果总结 前言 通过本文, 你将学会如何使用langchain来构建一个自己的知识库问答 其实大多数类chatpdf产品的原理都差不多, 我将其简单粗暴地分为以下四步: 构建知识库将知识库向量化召回…

ChatGPT in Drug Discovery

ChatGPT是OpenAI开发的一种语言模型。这是一个在大型人类语言数据集上训练的机器学习模型&#xff0c;能够生成类似人类语言文本。它可以用于各种自然语言处理任务&#xff0c;如语言翻译、文本摘要和问题回答。在目前的工作中&#xff0c;我们讨论了ChatGPT在药物发现中的应用…

微软“砍掉”元宇宙部门,刚成立四个月!网友:ChatGPT 会是下一个“元宇宙”吗?...

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在“喜新厌旧”这件事上&#xff0c;身在科技圈的人们应该很有发言权。 近期 ChatGPT 持续爆火&#xff0c;令这场竞逐热潮的规模愈发庞大&#xff1a;不仅微软、谷歌等国外科技巨头陆续下场&#xf…

文心一言,通营销之学,成一家之言,百度人工智能AI大数据模型文心一言Python3.10接入

“文心”取自《文心雕龙》一书的开篇&#xff0c;作者刘勰在书中引述了一个古代典故&#xff1a;春秋时期&#xff0c;鲁国有一位名叫孔文子的大夫&#xff0c;他在学问上非常有造诣&#xff0c;但是他的儿子却不学无术&#xff0c;孔文子非常痛心。 一天&#xff0c;孔文子在…

IT人专属AI工具

01 SQL助手 ① AirOps Sidekick 图源&#xff1a;官网截图 主要功能&#xff1a;创建个性化的电子邮件、产品描述或 SEO 内容&#xff1b;从非结构化数据中提取情感、关键事实和更多&#xff1b;将视频文件变成摘要和新内容&#xff1b;从一个SQL查询中获得洞察力和趋势。 &…