文章目录
引入
Spring-amqp是对AMQP协议的抽象实现,而spring-rabbit 是对协议的具体实现,也是目前的唯一实现。
使用
依赖
添加AMQP的启动器:
配置
在application.yml中添加RabbitMQ地址:
配置消费者
在SpringAmqp中,对消息的消费者进行了封装和抽象,一个普通的JavaBean中的普通方法,只要通过简单的注解,就可以成为一个消费者。
@Componet
@Componet:类上的注解,注册到Spring容器
@RabbitListener
@RabbitListener:方法上的注解,声明这个方法是一个消费者方法,需要指定下面的属性:
- bindings:指定绑定关系,可以有多个。值是@QueueBinding的数组。
@QueueBinding
@QueueBinding包含下面属性:
- ovalue:这个消费者关联的队列。值是@Queue,代表一个队列
oexchange:队列所绑定的交换机,值是@Exchange类型
okey:队列和交换机绑定的RoutingKey
类似listen这样的方法在一个类中可以写多个,就代表多个消费者。
模板类AmqpTemplate
Spring为AMQP提供了统一的消息处理模板:AmqpTemplate,非常方便的发送消息,其发送方法。
- 红框圈起来的是比较常用的3个方法,分别是:
指定交换机、RoutingKey和消息体
指定消息
指定RoutingKey和消息,会向默认的交换机发送消息
发送方
商品微服务
改造GoodsService
GoodsService中封装一个发送消息到mq的方法:(需要注入AmqpTemplate模板)
private void sendMessage(Long id, String type){
// 发送消息
try {
this.amqpTemplate.convertAndSend("item." + type, id);
} catch (Exception e) {
logger.error("{}商品消息发送异常,商品id:{}", type, id, e);
}
}
这里没有指定交换机,因此默认发送到了配置中的:leyou.item.exchange
什么时候发?
当商品服务对商品进行写操作:增、删、改的时候,需要发送一条消息,通知其它服务。监听。
发送什么内容?
对商品的增删改时其它服务可能需要新的商品数据,但是如果消息内容中包含全部商品信息,数据量太大,而且并不是每个服务都需要全部的信息。因此我们只发送商品id,其它服务可以根据id查询自己需要的信息。
接收方
搜索微服务、静态页微服务
监听者。
@Feature: mq监听器,消费者
*/
@Component
public class GoodsListener {
@Autowired
private SearchService searchService;
/**
* 处理insert和update的消息
* @param id
* @throws Exception
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "leyou.create.index.queue",durable = "true"), //队列持久化
exchange = @Exchange(
value = "leyou.item.exchange",
ignoreDeclarationExceptions = "true",
type = ExchangeTypes.TOPIC
),
key = {"item.insert","item.update"}
))
public void listenCreate(Long id) throws Exception{
if (id == null){
return;
}
//创建或更新索引
this.searchService.createIndex(id);
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "leyou.delete.index.queue",durable = "true"), //队列持久化
exchange = @Exchange(
value = "leyou.item.exchange",
ignoreDeclarationExceptions = "true",
type = ExchangeTypes.TOPIC
),
key = {"item.delete"}
))
public void listenDelete(Long id){
if (id == null){
return;
}
//删除索引
this.searchService.deleteIndex(id);
}
接收消息后如何处理?
- 搜索微服务:
增/改:添加新的数据到索引库
删:删除索引库数据 - 静态页微服务:
增/改:创建新的静态页
删:删除原来的静态页