首页广告缓存更新
需求分析
当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微服务,观察控制台输出和数据同步效果。