springboot如果我们不指定使用什么数据源(连接池),则默认使用springboot内嵌的hikariCP数据源,当然,若要使用数据源,则数据源相关的配置也必须配置上
springboot内嵌有三种数据源供我们选择使用
1.hikariCP
2.Tomcat提供的DataSource
3.Commons DBCP
无论是内嵌的数据源还是我们自己选的比如druid数据源,他们的配置都大同小异,比如:
如果只这样配置:则默认使用hikariCP数据源
但是需要对hikariCP数据源进一步配置,则需要下面这样配置,和配置一般的数据源有点类似,但是,配置hikariCP需要注意一点,他的url得写在hikari同一级,不然会报错,这里注意
JdbcTemplate是Spring对原始JDBC封装之后提供的一个操作数据库的工具类,是跟mybatis同一类的技术,操作数据库,实现持久化。
我们可以借助JdbcTemplate来完成所有数据库操作,比如:增删改查等
使用jdbcTemplate需要先有dataSource对象,即数据源对象,即先配置好数据源(springboot项目启动的时候会根据配置产生对应的数据源对象)
然后:
springboot内置了三款数据库。
1.H2
2.HSQL
3.Derby
这些数据库都很小巧,是内嵌的,是内存级别的数据库,用来搞测试非常方便,所以这三款数据库多用于测试
三种,他们模式都差不多,所以以H2为例子
使用还是那几步
1.导入依赖包
2.做配置
3.使用
这里学习整合三个常用的
1.Redis
2.Mongodb
3.ES
Redis是一款key-value存储结构的内存级NoSQL数据库
支持多种数据存储格式
支持持久化
支持集群
官方只提供linux版的Redis,windows版的由windows研发组维护这里以windows版本作为实例,整合springboot部分跟linux一样,这里以整合为主,并不是讲redis的,redis的知识后续再记录
windows版下载地址https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
,这个地址进不去的话需要魔法,因为是在github上的
选择msi的话,则是安装包,只用于学习的话,安装全部下一步即可,自己选择安装路径
目录下是这样的: 里面的三个需要注意一下
使用redis前需要先启动服务,即上面的redis-service,可以在cmd中如下操作,或者直接在文件中双击对应的可执行程序
若出现这样的启动失败
这是windows版redis的小BUG,则可以这样解决:
一般是是安装包出现这样的问题,如果这样则先打开客户端,然后执行下面的命令,然后在启动服务就可以了
整合也就那三步,1.导依赖包 2.做配置 3.使用
"\xac\xed\x00\x05t\x00\x06747976"
,用上面说的StringRedisTemplate就能解决这个问题lettcus与jedis区别:
jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响。
lettuce基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作。
MongoDB的基本知识这里确实没写啥东西,因为我也不太会,但是整合部分的知识倒是没问题。MongoDB的使用可以找更详细的课程
MongoDB是一个开源、高性能、无模式的文档型数据库。NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库
MongoDB多用于存储变动较快的数据
不常变动的一般用关系型数据库
官网下载好像得注册账号,忘记之前咋下载的了,这里把我的安装包分享一下:
链接:链接:https://pan.baidu.com/s/1rrKB0UfbOwPWsBAbG-zJ4A 提取码:duay
版本是5.0.6
bin文件夹下
这里mongo.exe就是启动客户端的可执行程序
安装后之后,第一次使用需要初始化 启动服务也是这个命令
默认端口:27017
启动客户端,双击mongo.exe就行
依然是之前保存的资源:
链接:链接:https://pan.baidu.com/s/1UjjsVokjYMEoTHBQF0AN8A 提取码:ynt2
版本是1.4.4
如果连接不上mongodb,那很可能是和mongobd的版本不符,但是我这俩版本不冲突
进来之后就这弔样,先连接,我这里已经连接过了,所以有记录
mongodb的详细使用可以参考对应的教程
整合无非就那三步,导包,配置,使用
这里记录几个常用的
1.缓存 2.发邮件 3.消息队列
缓存是一种种介于数据永久存储介质与数据应用之间的数据临时存储介质
使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能
在软件中,因为两者对接而出现的一些问题,加一层能解决其中大部分的问题
缓存就是这样,若程序频繁访问数据库,则会极大的影响程序整体的性能
缓存就是在这两者之间加一层,缓存把常用的数据存储到内存中,然后程序去缓存中访问数据,这样就避免程序频繁访问数据库
缓存的作用不止是可以减低速数据读取过程的次数,还可以用于记录程序运行期间产生的一些无需进入数据库的数据,比如验证码
Spring提供的缓存技术除了提供默认的缓存方案,还可以对其他缓存技术进行整合,统接口,方便援存技术的开发与管理,有这么一些:
Generic
JCache
Ehcache
Hazelcast
Infinispan
Couchbase
Redis
Caffenine
Simple (默认)
还有一个技术memcache也挺常用,但是boot并未给整合,我们需要手动整合
这里记一下几个常用的缓存技术
1.Redis 2.Memcached 3.Ehcache
注意几点:
随便搞一搞的话很简单
如果是验证码,则先获取验证码,然后存入Map,比对的时候从Map中取,这样这个数据就是只存在内存中的
springboot提供了自己默认的缓存技术
springboot中的缓存默认使用Simple
可以导入对应的依赖包后直接使用即可
然后三步:
启用缓存
设置进入缓存的数据
设置读取缓存的数据
实验一个用缓存存储验证码的业务,作为后续用不同缓存技术的模板,这里先使用默认的Simple作为缓存技术
需求
输入手机号获取验证码,组织文档以短信形式发送给用户(页面模拟)
输入手机号和验证码验证结果
需求分析
提供controller, 传入手机号,业务层通过手机号计算出独有的6位验证码数据,存入缓存后返回此数据
提供controller, 传入手机号与验证码,业务层通过手机号从缓存中读取验证码与输入验证码进行比对,返回比对结果
service层:
对应产生验证码,和获取验证码的类,这里有一点很重要,需要注意
三步
配置文件内容
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
updateCheck="false">
<diskStore path="D:\ehcache" />
<defaultCache
eternal="false"
diskPersistent="false"
maxElementsInMemory="1000"
overflowToDisk="false"
timeToIdleSeconds="60"
timeToLiveSeconds="60"
memoryStoreEvictionPolicy="LRU" />
<cache
name="smsCode"
eternal="false"
diskPersistent="false"
maxElementsInMemory="1000"
overflowToDisk="false"
timeToIdleSeconds="10"
timeToLiveSeconds="10"
memoryStoreEvictionPolicy="LRU" />
ehcache>
三步:
SpringBoot未提供对memcached的整合,所以这里也是相当于记录了如何整合springboot未整合的技术的模板
没有本地或者远程的服务的话,我们需要先在自己本机上下载对应的服务:地址https://www.runoob.com/memcached/window-install-memcached.html
然后以管理员身份进入cmd,再进入memcached安装目录,执行安装
启动和停止服务的命令:
都需要在memcached安装目录下执行
服务有了,使用这个服务我们需要选择客户端
啥意思呢?就像redis,他的bin目录下有redis-service(服务端),redis-cli(客户端)
就是说redis提供了客户端,所以不需要我们特意去找客户端,但是memcached没有提供,所以需要我们去选择使用
memcached客户端选择
Memcached Client for Java:最早期客户端,稳定可靠,用户群广
SpyMemcached: 效率更高
Xmemcached:并发处理更好
我们选择Xmemcached
但是SpringBoot未提供对memcached的整合,需要使用硬编码方式实现客户端初始化管理
其实还是那三步,但是在配置上差别稍微大一点:
https://blog.csdn.net/qq_45821251/article/details/123188505?spm=1001.2014.3001.5501#yml_75
(哈哈,这个也是我的笔记)https://blog.csdn.net/qq_45821251/article/details/123188505?spm=1001.2014.3001.5501#lombok_206
(哈哈,还是我那篇笔记中的)企业开发中,总不免有些需要定时执行的任务,比如年度报表,缓存统计报告…
Quartz是市面上比较流行的定时任务技术
Quartz将定时任务拆分又加了一些设定
quartz中有这么一些相关的概念
相关概念
工作 (Job) :用于定义具体执行的工作
工作明细 (JobDetail) :用于描述定时工作相关的信息
触发器 (Trigger) :用于描述触发工作的规则,通常使用cron表达式定义调度规则
调度器 (Scheduler) :描述了工作明细与触发器的对应关系
使用这个技术也是三步
(“a b c d e f”)
一般有六项,从左到右分别代表,a:秒,b:分,c:时,d:日,e:月,f:星期几
他们的值设置为*
则表示任意,如"5 * * * * *"
表示任意分钟的5秒执行
一般d和f不会同时设定一个具体的值,比如不能这样设置"0 * * 1 * Monday"
这谁能确定1号就是星期1呢?所以一般是若一个设置为具体的值,则另一个需要设置为?
表示根据另一个值进行匹配,如"0 * * 1 * ?"
根据前面日子匹配星期
每一项有可以设定各种的值,如
"0/5 * * * * ?"
表示每隔5s执行一次
"0 5/5 * * * ?"
表示从每小时的第五分钟开始运行,每隔5分钟运行一次
"0,5,8,56 * * * * ?"
表示每分钟的0秒、5秒、8秒、56秒执行
更详细的可以去学习一下,网上一大堆,cron表达式生成器也一搜一大堆
由上面几个步骤,就知道这个quartz多让人难受了
还好,springboot给整了个简单方便的
只需简单的两步就能实现简单的定时任务
@EnableScheduling
@Scheduled(cron = "")
cron的值是cron表达式,作用就是设置执行时间和频度等,这个类需要被标注为bean,交由spring管控只这两步,就完成了定时任务
更详细的设定,可以通过配置文件来搞
关于收发电子邮件有三个协议
SMTP (Simple Mail Transfer Protocol) :简单邮件传输协议,用于发送电子邮件的传输协议
POP3 ( Post Office Protocol - Version 3) :用于接收电子邮件的标准协议
IMAP ( Internet Mail Access Protocol) :互联网消息协议,是POP3的替代协议
POP3协议因为同步问题,被IMAP替代了
三步
这就实现了简单邮件的发送
下面是可以包含链接,图片,文件等等信息的邮件发送
多部件邮件其实就是邮件中能够包含多个部件的邮件
比如包含附件的邮件,甚至能够通过html格式解析邮件正文
发送这样的邮件的步骤和发送简单邮件的步骤一样
只是更换消息对象,和设置数据信息的方式
如果,要在正文中嵌入图片
如果图片是在网络上,则直接使用"",然后用开启html解析即可
如果是本地的图片,则需要换一个把戏
如下:这是如果图片是在本地的情况下
实现内嵌图片是靠下面标注出来的地方,注意下面标注出来的地方,在后面讲
src="cid:MUR"
相对应其实这里的原理:
看一下官方的这段话:
Multipart email允许添加附件和内嵌资源(inline resources)。内嵌资源可能是你在信件中希望使用的图像或样式表,但是又不想把它们作为附件。
就是说,这里潜入的内嵌资源也是附件,即也是多部件的一个部件,通过上面的操作,可以将这个附件不按照附件的形式来展示,而是通过内嵌的形式,潜入到邮件正文中
注意重要的一点:在下面这个地方,依然要增加第二个参数,并为其设置为true,因为这个内嵌的资源也是多部件的一种
什么是中间件?
我也不是很明白,就是你好像知道,但是描述不出来,这说明了解的还是太少
百度百科:
中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。
IT界有句俗话说,所有问题都可以通过增加一层来解决。
中间件也是加一层,在两个服务之中加一层
比如redis,中间件的一种,他就是在程序和数据库之间加一层,当然redis不仅仅能用于存储数据库信息。再比如RabbitMQ,消息队列,就是在消息的发送方和接收方之间加一层,提高了极大的效率。
就这么回事
什么是消息?
百度百科:
“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
很了然了,就是数据单位
消息有发送方和接收方
我们称为生产者和消费者
消息有同步消息和异步消息
同步消息:
生产者向消费者发送消息,只有得到消费者的回应后,生产者才会进行下一步的操作,这样的称为同步消息
异步消息:
生产者向消费者发送消息,无需得到消费者的回应,生产者即可进行下一步的操作,这样的称为异步消息
什么是消息队列?
百度百科:
“消息队列”是在消息的传输过程中保存消息的容器。
同步消息对我们的意义不是很大,消息队列的高并发靠的是异步消息
相关产品有RabbitMQ,ActiveMQ,RocketMQ… …
企业级应用中广泛使用的三种异步消息传递技术:
JMS
AMQP
MQTT
这三组对应了又有若干个实现技术,比如消息队列中现在常用的
RabbitMQ,ActiveMQ,RocketMQ… …
JMS:
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
AMQP:
JMS出来的要比AMQP早,JMS是一个规范,类似于JDBC,而且JMS定义的一些接口仅适用于Java平台,并不适用于其他语言,所以在这个基础上人们提出了一个协议
他将所有的消息种类规范为字节单位,主要就是靠这个实现跨平台的。消息模型注意direct和topic两个模型
百度百科:
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。
他兼容JMS
AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。AQMP可以用http来进行类比,不关心实现的语言,只要大家都按照相应的数据格式去发送报文请求,不同语言的client均可以和不同语言的server链接。
AMQP跟JMS的关系可以类比于炒菜:AMQP规范了炒菜动作,JMS规范了放啥原料,炒菜动作都差不多,放啥原料要根据炒啥菜来放
MQTT
用于物联网
常用实现消息队列的技术有四个:
RabbitMQ
ActiveMQ
RocketMQ
Kafka:一种高吞吐量的分布式发布订阅消息系统,提供实时消息功能,可以实现消息队列的功能,但主要不使用用于做消息队列
这里记录两个常用的消息队列的整合
RabbitMQ
ActiveMQ
先实现一个简单的业务,基于这个业务用于后续整合消息队列
业务功能:模仿订单处理其中的发短信功能(并不是真正的发短信)
两个类,一个表示类用于调用处理具体业务的具体实现(实际应该是这样做,这里是模拟,就意思意思一下),这里模拟的是发送短信,所以至少应该有一个实现具体发送短信的类吧,这里第二个类就是这个作用,当然就是具体意思意思,也不是真正的发送短信
一个实现具体发送短信业务的类:
按照开发流程,进行具体的发短信业务的类是消费消息,也应该对应一个视图层,不然里面的具体的发短信业务的那个方法无法调用
两个视图层:
Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件;由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。
市场使用量也很大
下载地址:https://activemq.apache.org/activemq-5016004-release
这个是5.16.4版本,5.17即往上需要jdk 11+
启动服务需要三个端口:5672,61613,1883,启动失败可以看看是哪个端口被占用:
比如这里,我启动active服务失败了,往下找到第一个报错的地方,可以看到是说5672的端口被占用
然后我们可以查找当前这个端口是被什么玩意给占了,把相关进程关了就行,一般我们能手动关闭的进程都是不重要的,不要担心因为手动关闭进程而导致电脑系统崩掉
根据端口关闭进程的方法后面再记录(往下找就能找到),这里直接接着上面写
这里就是因为我安装了RabbitMQ所需要的erlang语言,他的后台进程会占用5672端口,把它关闭了服务就能启动
启动服务
启动服务就是启动bin下的activemq.bat
直接点击或在cmd执行都可
这个样子:可以看到最下面,给了一个地址,这个是activeMQ给我们提供一个web端的控制台的地址
进入这个地址,会问你要密码和账户,初始默认都是admin,然后进入后这样:
点击那个Manage ActiveMQ broker
就能进入如下这样的相关的管理界面
分为两步:
netstat -ano | findstr 端口号
tasklist|findstr PID值
taskkill -PID PID值 -F
三步
tcp://localhost:服务的端口号
但是,在实际开发中,我们很少搞这种点一下才进行消费消息队列中的消息,我们一般都是消息过来,马上就消费
MQ中提供了一套这样的解决方案,设置一个监听器,来监听消息队列中对应的存储空间
一旦有消息,立即消费,就是说,原存储空间中有的,这里也会一个一个全给消费了
这里还有一个配置,比较重要
JMS规定的消息模型有俩,点对点和发布订阅模型
设置当前所使用的的消息模型,如下
设置成功后,发布的消息会显示在Topics里面,而不会显示在Queues里面了,如下:
后续相关点对点和发布订阅在后面再说
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
运行它需要erlang环境,就是说我们需要先安装erlang并配置,然后才能再安装使用RabbitMQ
安装RabbitMQ需要先安装erlang
我用的是24.3.2
下载地址:https://www.erlang.org/patches/otp-24.3.2
别乱下载版本,不同版本的RabbitMQ对不同的erlang版本不一定支持
挂魔法进行下载的话会快一点,但是这个文件挺大,挺消耗流量,而且不挂魔法还不一定能下
既然这样,分享一下,我的云链接。这个是安装包形式的,安装只需点击下一步即可,自己选安装路径,需要注意的是目录要没有空格和中文字符
链接:https://pan.baidu.com/s/1sIk308-KooBgwXvjBY_r_w 提取码:13ql
安装完重启一下电脑
然后需要配置环境变量:
大家学Java的,知道咋配吧?
windows+R,输入sysdm.cpl回车,可快速进入系统属性
选择高级,进入环境变量:
然后根据需要,在系统变量或者用户变量中新建一个:变量名是ERLANG_HOME,变量值指向erlang安装路径,如下:
上面的东西放哪,就找到哪里的对应的path,点击编辑,把上面的东西加进去,如下,需要指向bin目录
然后都点击确定,直到退出即可。
有一点需要知道,上面保存之后,在当前cmd窗口中并不会生效,要想生效,重新打开cmd窗口即可
上面erlang搞好后,就可以安装rabbitMQ了,如果没搞好,RabbitMQ甚至不让你安装
下载路径:https://www.rabbitmq.com/news.html#2022-03-23T14:00:00+00:00
不挂魔法依然不一定能进去
所以来吧,我的分享一下:
链接:https://pan.baidu.com/s/1i9RWzixpORfVNhVgT08x2A 提取码:pxbk
版本3.9.14,和上面erlang版本兼容
安装就点击下一步就行,主要自己选择安装路径。需要注意的是目录要没有空格和中文字符
RabbitMQ的目录:
这里他喜欢搞特殊化,把可执行文件放在了sbin下了:
接下来,我们就能启动使用rabbitMQ的服务了
启动服务:
以管理云身份运行cmd,在RabbitMQ安装目录下的sbin目录下执行这个命令:
rabbitmq-service.bat start
刚安装好后,可能会出现下面这种情况下,这是因为RabbtMQ服务已经启动了,RabbitMQ刚安装好后,会默认启动RabbitMQ服务
停止这个服务的命令:rabbitmq-service.bat stop
再启动:
跟ActiveMQ一样,RabbitMQ也有一个web端的控制台,但是需要我们手动开启这个插件
需要用到sbin目录下的rabbitmq-plugins.bat
可执行程序
首先,以管理员身份进入cmd,再进入RabbitMQ下的sbin目录,通过这个命令可以查看他携带了哪些插件:rabbitmq-plugins.bat list
执行这个命令可以开启web端的控制台的插件:注意一件事情,应该在服务运行的情况下执行下面的命令
rabbitmq-plugins.bat enable rabbitmq_management
然后再查看:开启这个功能之后,会附带开启这三个插件,即带[e/E*]的,如果不带*
,则应该是在rabbitMQ服务停止的情况下开启的这个web端控制台插件,此时还无法访问web端控制台,这样的情况只需开启RabbitMQ服务,在这种情况下,再次执行上面开启插件的命令即可
这样就可以访问web端的控制台了
地址:http://localhost:15672
,进入要账号密码,初始都是guest,然后进入就是这弔样:
但是!!!这里面蕴含着一个BUG。这个BUG影响的地方很多,但是我们第一次意识到他的存在应该是在开启web端控制台的时候
下面说一说,顺便说一说解决方法:
是否会遇到这个BUG跟自己当前电脑的用户名有关,如果包含中文,或者包含空格,就会遇到这个BUG
在RabbitMQ服务运行的情况下,当在开启web端控制台的步骤那里,执行开启的命令,可能会报下面的错,无法开启。而且,这个BUG会影响到sbin下的某些可执行命令,某些命令出错可能也是因为这个问题。(当时研究这个问题研究了好几天,woc,头都快裂开,后来终于找到问题所在和解决方法)
注:如果在没有开启RabbitMQ服务情况下开启这个插件不会报错,但是也无法真正的开启,web端依旧无法访问到
为什么会出现这个BUG?
我们进入C:\Users\当前用户名所命名的文件夹\AppData\Roaming
这里,可以找到一个这个文件夹:
RabbitMQ默认将日志和数据存储在这个里面,如果这个路径带有中文或空格,则就会导致RabbitMQ读取相关信息出错
解决方法:
第一种,该用户名呗,这种好像最简单,但是我觉得这个蕴含着一些未知的问题,而且我也不想改,咋办?
方法二:
修改RabbitMQ的默认日志和数据存储路径。
步骤如下:
rabbitmq-service.bat remove
set RABBITMQ_BASE=D:\RabbitMQ_erLang\RabbitMQ\data(自己创建的文件夹路径,此处是我的data文件夹路径,这个是我设置的新的rabbitmq存放日志和数据的文件夹)
rabbitmq-service.bat install
至此,问题解决,此时,我们再启动服务,再开启对应的插件,就不会出问题了:
原来RabbitMQ默认的存储日志和数据的文件夹已经没作用了,不想要可以删了
JMS中有两个经典的数据模型:点对点和发布订阅模型
AMQP有五个:标注出来的这俩分别与点对点和发布订阅模型非常相似,比较常用
direct exchange:直连交换机
topic exchange:主题交换机
使用方法
三步
1.导入依赖
导入的是springboot整合的amqp的包,里面包含了rabbit的依赖包
2.配置
3.使用
先开启rabbitMQ的服务
然后再使用
这里我们跳过通过手动点击实现消费消息的业务,只通过监听器来进行消费
首先还是前面那个业务,这里只是换一种消息队列实现方式
这里使用两个常用的消息模型作为展示
记一下这两个模型:
这里只是以整合为主,详细的RabbitMQ知识无法兼顾到,可以另外学习
直连交换机
amqp中,通过AmqpTemplate来操作消息队列
通过template.convertAndSend()方法可以向对应的消息队列中传递消息
如下:
template.convertAndSend()方法需要三个参数
第一个代表交换机Bean的字符串,第二个,代表Binding(绑定键)的Bean的字符串,第三个,所需要传入的消息本身
其中,Binding是由交换机和存储消息队列的Bean绑定而成,这些需要从第三方那里获取。按照开发规范,从第三方获取的Bean应该在配置类中获取,所以下面搞一个配置类:
将交换机和Binding(绑定键)传入template.convertAndSend()方法,再传入发送的消息,即可发送到对应的存储空间中
主题交换机
与直连交换机代码上没有多少区别,但是工作模式差别很大
用主题交换机可以制造出来直连交换机的效果
直连模式使用的交换机是directExchange类型的,他的模式像是JMS中的点对点
主题交换机使用的是topicExchange类型的,他的模式像是JMS中的发布订阅
amqp中,不同消息模型靠不同形式的交换机来设置和区分
topicExchange类型的有这样的特点:
topic类型的交换机增加了".“和”#"的匹配,比Direct类型灵活。.
表示匹配任意一个单词,#
表示匹配任意个数的任意单词
这俩字符匹配机制作用:绑定键可以更灵活的接收多个不同的消息,或者多个绑定键可以同时接收一个消息的发送
比如绑定键设置这样的名称:
order.*.id
: 则可以通过order.任意单词.id
来向这个绑定键发送消息
order.#
: 则可以通过order.任意单词.任意单词....
来向这个绑定键发送消息
代码没多多少区别:下面是配置类:
定义两个消息队列的对象和一个主题交换机,将消息队列对象和这种类型的交换机进行绑定就能实现topic exchange
消息模型
然后将这俩消息队列的bean和同一个主题交换机绑定起来,形成两个绑定键,设置对应的匹配规则(标识符)是order.*.id
和order.#
。然后我们在发送消息的时候,就能根据这些匹配规则向对应的消息队列中发送消息
下面是发送:按照匹配机制,这里能把这个消息同时发送给两个消息队列。
这里我们是直接使用监听器来对消息队列中的消息进行消费,如下,两个监听器,分别监听消息队列topic_queue
和消息队列topic_queue2
,这两个消息队列即对应着两个绑定键
然后通过postman测试:
所以还是说:
直连模式使用的交换机是directExchange类型的,他的模式像是JMS中的点对点
主题交换机使用的是topicExchange类型的,他的模式像是JMS中的发布订阅
topicExchange类型的有这样的特点:
topic类型的交换机增加了".“和”#"的匹配,比Direct类型灵活。.
表示匹配任意一个单词,#
表示匹配任意个数的任意单词
这俩字符匹配机制作用:绑定键可以更灵活的接收多个不同的消息,或者多个绑定键可以同时接收一个消息的发送
topicExchange交换机可以很轻松的实现directExchange交换机的功能,只要不使用.
和#
匹配符即可
这里还是要说,涉及到的某些单一的技术并没有做很详细的讲解,以整合为主,但是足够会基本使用和了解了。某个单一的技术更详细的知识还是要找具体的课程学习
和上一篇 前一段时间学习的springboot+vue的一个小案例,还有中间的几篇笔记,加在一起,关于springboot的东西差不多都有了。
但是还有一点点的东西没做笔记,等之后再记录,先去转战redis
和项目去了