参考:https://juejin.cn/post/7295731039032344610

 

1 简介

  遇到一个业务,报修订单打印不成功,想要10分钟后重试打印保修订单,于是想到监听redis的key过期来实现

  项目现状:已经成功连接使用redis了,所以不需要做redis的一些基础配置

 

2 配置redis开启监听

image

 

3 添加依赖

  项目添加相关依赖

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

 

4 监听器

  创建一个监听器,监听所有过期的key

package com.ruoyi.pad.jrepair.config;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.pad.jrepair.news.service.JrepairUserManagerService;
import com.ruoyi.pad.jrepair.old.mapper.JrepairMapper;
import com.ruoyi.pad.jrepair.old.pojo.Jrepair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    // 监听redis过期

    @Autowired
    @Qualifier("jrepairusermanagerservice")
    private JrepairUserManagerService jrepairusermanagerservice;

    @Autowired
    private JrepairMapper  jrepairMapper;

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 监听redis数据过期事件,进行数据处理
     * @param message 失效的key
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {

        try {
            String key = message.toString();
            dealJrepairPrint(key); // 处理物业报修打印失败的数据
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 处理物业报修打印失败的数据 -
    // 物业报修打印尝试两次还是失败的,
    // 存储id到redis,设置有效时间10分钟,
    // 10分钟到了,在这里再次尝试打印
    private void dealJrepairPrint(String key) throws Exception {
        if(key.contains("jrepairPrintError-")){
            String[] split = key.split("-");
            if(split.length > 1){
                String s = split[1];
                if(StringUtils.isNotEmpty(s)){
                    // 去处理
                    Jrepair repair = jrepairMapper.selectByPrimaryKey(Integer.parseInt(s));
                    jrepairusermanagerservice.print(repair, "");
                }
            }
        }
    }
}

 

5 key存入redis设置过期时间

  打印失败时,把这个订单存入redis,有效时间为10分钟

redisCache.setCacheObject("jrepairPrintError-" + repairno,repairno,10, TimeUnit.MINUTES);