作为一个消息队列,RabbitMQ 也可以作为应用程序之间的通信.
消费者代码生产者代码放在不同的应用中即可完成不同应用程序之间的通信
下面以订单程序为例,展示的就是一种基于 Spring + RabbitMQ 实现的应用间的通信
需求描述:
用户下单成功后,,通知物流系统,进行发货(此处只进行应用间通信,不实现其他的具体功能)
订单系统作为一个生产者,物流系统作为一个消费者
1. 创建项目
这里我把两个项目放到一个项目里面,也可以进行拆开
1~ 创建一个空项目(一个空的文件夹)
2~ 在项目中,创建 Module
3~ 后面的流程和创建 SpringBoot 相同
此处创建出两个项目 1) logistics-service 2) order-service
如果创建的项目出现如下情况,说明该项目没有被加载成 Maven 项目
pom 文件图标显示不同
正常情况
修改配置文件
最终结构
2. 订单系统(生产者)
声明队列
编写下单接口,下单成功后,发送订单消息
查看消息
3. 物流系统(消费者)
监听队列
@RabbitListener(queues = "order.queue") 可以加在类上, 也可以加在方法上, 用于定于一个类或者方法作为消息的监听器
@RabbitHandler 是一个方法级别的注解, 当使用 @RabbitHandler 注解时, 这个方法将被调用处理特定的消息(从队列中获取到的消息类型可能会不同,该注解会根据消息的类型去匹配不同方法的参数,调用不同的方法)
访问订单系统的接口,在物流系统的日志中观察到下单消息
发送消息的格式为对象
创建 OrderInfo 实体类,并实现 Serializable 接口(不需要重写)
修改生产者代码
发送消息
上述消息是被序列化为 二进制 的结果,难以观察
MappingJackson2MessageConverter 等转换器, 我们需要把一个 MessageConverter 设置到RabbitTemplate 中
1. 修改生产者代码
将消息序列化
2. 修改消费者代码
此处将 order-service 打成一个 jar 包供 消费者引用(非正常情况)--> 可以将 OrderInfo 提取出来分别供生产者和消费者使用生产者把消息序列化,消费者也需要把消息序列化![]()
重启服务,发送消息![]()
![]()