Spring AMQP

引入

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);
    }

接收消息后如何处理?

  • 搜索微服务:
    增/改:添加新的数据到索引库
    删:删除索引库数据
  • 静态页微服务:
    增/改:创建新的静态页
    删:删除原来的静态页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万码无虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值