Loading

首页广告缓存更新

需求分析

当tb_ad(广告)表的数据发生变化时,更新redis中的广告数据。

实现思路

(1)修改数据监控微服务,监控tb_ad表,当发生增删改操作时,提取position值(广告位置key),发送到rabbitmq

(2)从rabbitmq中提取消息,通过OkHttpClient调用ad_update来实现对广告缓存数据的更新。

代码实现

发送消息到mq

(1)在rabbitmq管理后台创建队列 ad_update_queue ,用于接收广告更新通知

(2)引入rabbitmq起步依赖

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

(3)配置文件application.properties 添加内容

spring.rabbitmq.host=192.168.200.128

(4)新增rabbitMQ配置类

@Configuration
public class RabbitMQConfig {
​
    //定义队列名称
    public static final String AD_UPDATE_QUEUE="ad_update_queue";
   
​
    //声明队列
    @Bean
    public Queue queue(){
        return new Queue(AD_UPDATE_QUEUE);
    }
​
}

(4)修改BusinessListener类

@CanalEventListener //声明当前的类是canal的监听类
public class BusinessListener {
​
    @Autowired
    private RabbitTemplate rabbitTemplate;
​
    /**
     *
     * @param eventType 当前操作数据库的类型
     * @param rowData 当前操作数据库的数据
     */
    @ListenPoint(schema = "changgou_business",table = "tb_ad")
    public void adUpdate(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
        System.out.println("广告表数据发生改变");
​
        for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
            if ("position".equals(column.getName())){
                System.out.println("发送最新的数据到MQ:"+column.getValue());
​
                //发送消息
                rabbitTemplate.convertAndSend("", RabbitMQConfig.AD_UPDATE_QUEUE,column.getValue());
            }
        }
    }
}

5)测试,运行数据监控微服务canal,新增、修改或删除tb_ad表数据,修改后观察控制台输出和rabbitmq管理界面中ad_update_queue是否接收到消息

从mq中提取消息执行更新

(1)changgou_service_business工程pom.xml引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.9.0</version>
</dependency>

(2)在spring节点下添加rabbitmq配置

  rabbitmq:
    host: 192.168.200.128

(3)com.changgou.business包下创建listener包,包下创建类

@Component
public class AdListener {
​
    @RabbitListener(queues = "ad_update_queue")
    public void receiveMessage(String message){
        System.out.println("接收到的消息为:"+message);
​
        //发起远程调用
        OkHttpClient okHttpClient = new OkHttpClient();
        String url = "http://192.168.200.128/ad_update?position="+message;
        Request request = new Request.Builder().url(url).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败
                e.printStackTrace();
            }
​
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //请求成功
                System.out.println("请求成功:"+response.message());
            }
        });
    }
}

(7)测试,启动eureka和business微服务,观察控制台输出和数据同步效果。

posted @ 2021-08-03 15:56  1640808365  阅读(105)  评论(0编辑  收藏  举报