实战如何通过SpringAMQP集成RabbitMQ

目录

需求分析

生产者发送消息

1.引入依赖

2.配置文件

3.改造GoodsService

消费者接受消息

测试


需求分析

以微服务项目举例。

item-service项目是生产者,里面集成了对商品的增删改查操作。

search-service是消费者1,负责获取商品的各种信息

goods-web是消费者2,这个项目负责把常用的商品页面静态化,并持久化到本地,提高搜索效率和资源利用效率

通过分析,我们得知生产者需要的操作是增删改时发送商品id(spuid),消费者需要的操作是随着商品信息的变化增删改索引库,增删改静态页面。

RabbitMQ中三种订阅模式都适用这个需求,本文使用订阅模型-Topic

生产者发送消息

我们先在商品微服务leyou-item-service中实现发送消息

1.引入依赖

在pom文件中引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2.配置文件

在applicaiton.yml文件中配置MQ连接信息

3.改造GoodsService

先注入amqp模板

我们找到新增商品的方法,在最后面加上发送消息

然后ctrl+alt+M抽取方法。对于新增商品,我们传的参数是insert

更新商品

消费者接受消息

 接受者以goods-web为例,前两步同样是引入依赖和添加配置

然后我们新建一个监听者类

配置如下

package com.leyou.goods.listener;

import com.leyou.goods.service.GoodsHtmlService;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class GoodsListener {

    @Autowired
    private GoodsHtmlService goodsHtmlService;

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "LEYOU.ITEM.SAVE.QUEUE", durable = "true"),
            exchange = @Exchange(value = "LEYOU.ITEM.EXCHANGE", ignoreDeclarationExceptions = "true", type = ExchangeTypes.TOPIC),
            key = {"item.insert", "item.update"}
    ))
    public void save(Long id) {
        if(id == null) {
            return;
        }
        this.goodsHtmlService.createHtml(id);
    }


    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "LEYOU.ITEM.DELETE.QUEUE", durable = "true"),
            exchange = @Exchange(value = "LEYOU.ITEM.EXCHANGE", ignoreDeclarationExceptions = "true", type = ExchangeTypes.TOPIC),
            key = {"item.delete"}
    ))
    public void delete(Long id) {
        if(id == null) {
            return;
        }
        this.goodsHtmlService.deleteHtml(id);
    }
}

最后执行的createHtml方法就是通过thymeleaf持久化到本地的方法

另一个微服务项目也做如上操作

测试

两个微服务项目都配置好RabbitMQ后,我们测试一下。

1.启动elasticsearch

2.重启修改后的三个微服务项目

3.启动门户网站的前端,再启动后台系统的前端。

目前从门户网站浏览到华为G9青春版是849

我们在后台页面上把价格改成850

刷新前台页面,价格同步了

然后我们再看下rabbitmq上的消息,可以看到不论是队列还是交换机都配置上了。

最后再来看一下静态页面是否持久化到本地了。里面的内容走的是数据绑定,查询数据库中的价格信息。

到此我们通过订阅topic模型实现了消息通信

发布了343 篇原创文章 · 获赞 162 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Delicious_Life/article/details/104412688