注:本文章基于尚硅谷Springboot高级特性相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取欢迎在评论区留言或者联系作者!
消息初解
大多应用中,可以通过消息服务中间件来提升系统异步通信,扩展解耦能力
消息服务中两个重要概念:
消息代理(服务器)和目的地
当消息发送者发送信息之后,将由信息代理接管,消息道理保证信息传递到指定目的地;
消息队列主要有两种目的地形式:
- 队列:点对点消息通信
- 消息发送者发送信息,消息代理将其放入一个队列中,消息接受者从队列中获取消息内容。消息读取后被移出队列
- 消息只有唯一的发送者或接受者,但并不是说只能有一个接受者
- 主题:发布/订阅消息通信
- 发送者发布消息到主题,多个接受者监听(订阅)这个主题,那么就会在消息到达的同时收到消息
- JMS java消息服务
- AMQP:高级消息队列协议,也是一个消息代理规范,兼容JMS(RabbitMQ是AMQP的实现)
@JmsListenner、@RabbitListener注解方法上监听消息代理发布的消息
@EnableJms,@EnableRabbit开启支持
RabbitMQ初始环境配置:
(1)首先需要安装RabbitMQ,这里我们采用的是在Windows系统下进行安装,安装方法可以参考本人的另一篇文章【RabbitMQ】手把手教你windows环境下安装RabbitMQ及错误解决
(2)安装完成后,使用http://localhost:15672 访问RabbitMQ的web管理页面,创建三个常用的交换器(exchange.fanout,exchange.direct,exchange.toppic);
Exchange–>add a new exchange如下图所示
(3)添加队列,Queue–>add a new queue,添加如下图的四个队列
(4)将所有队列和所有路由分别进行绑定
前面exchange.direct和exchange.fanout的绑定都是一样的,这里要注意ticop的绑定,RoutingKey如下图所示,按照下图进行绑定;
(4)模拟发送信息,Exchange->Publish message中设置好相应的参数,RoutingKey设置为pojo123,如下图所示,然后对数据进行发送
结果如下,可以看到pojo123队列收到了该信息:
创建工程整合RabbitMQ
(1)引入依赖文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
查看引入的自动配置:
**1. RabbitAutoConfifuration (自动配置类)
2. 有自动配置了连接工厂 ConnectionFactory;
3. RabbitProperties封装了Rabbit的自动配置
4. RabbitTemplate:给RabbitMQ发送和接受消息
5. AmqAdmin:RabbitMQ系统管理功能组件
AmqAdmin:创建和删除Queue(消息队列),Exchange(交换器),Binding(绑定规则)
7. @EnableRabbit+@RabbitListenner 监听消息队列内容**
(2)编写发送信息测试文件,
这里使用提供的rabbitTemplate进行消息的转换和发送
@Test
void contextLoads() {
//Messag需要自己构造一个;定义消息体内容和消息头
//object默认当成消息体,只需要传入要发送的对象,自动序列给rabbitmq
// rabbitTemplate.convertAndSend(exchage,routekey,object);
HashMap<String, Object> map = new HashMap<>();
map.put("msg","这是第一个消息");
map.put("data", Arrays.asList("hello",123,true));
rabbitTemplate.convertAndSend("exchange.direct","pojo123.news",map);
}
运行后可以发现pojo123队列中多了这个数据,但是会发现和之前的缓存一样,序列化出现问题,但是证明数据传输没有问题,后面我们将会对这个问题得到解决;
(3)编写测取信息测试文件:
这里编写测试文件获取pojo123.news队列中的数据并进行转换,可以发现能够正常 获取和转化;
@Test
void receive(){
Object o = rabbitTemplate.receiveAndConvert("pojo123.news");
System.out.println(o.getClass());
System.out.println(o);
}
运行结果:
(4)加入序列化机制
编写配置类,使用jackson2json的消息转换机制
@Configuration
public class MyAMQPConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
在此运行发送信息测试文件,可以发现数据能够正常显示,编写序列化配置文件成功
后面传入和获取实体类也可以,可以自行测试
(5)测试使用监听机制:
使用开发中常用@RabbitListener注解监听指定名称队列的消息情况,这种方式会在监听到指定队列存在消息后立即进行消费处理。
首先编写service类,当监听到pojo123.news队列中含有数据消息时,就会获取消息并输出;然后在启动类上加入@EnableRabbit注解,启动Rabbit监听机制;
@Service
public class QueuesListennerService {
@RabbitListener(queues = "pojo123.news")
public void receive(String str){
System.out.println("收到消息"+str);
}
}
运行结果如下图,说明能够正常监听
总结
本内容主要针对Springboot与RabbitMQ消息中间件的整合进行了叙述和讲解,后面还有使用Amqadmin分别对队列,交换器,绑定进行创建修改等操作的内容,较为简单,可以在上面的基础上进行后续的学习,这里将不再进行叙述;