参考:https://juejin.cn/post/7295731039032344610
1 简介
遇到一个业务,报修订单打印不成功,想要10分钟后重试打印保修订单,于是想到监听redis的key过期来实现
项目现状:已经成功连接使用redis了,所以不需要做redis的一些基础配置
2 配置redis开启监听

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