0
点赞
收藏
分享

微信扫一扫

使用Redis的Key过期回调 ,实现订单超时关闭

zibianqu 2022-04-14 阅读 33
java

流程

1. 用户下单、存Redis key(0号库文件夹名称+订单号) value(订单号) 、设置失效时间。

2. 超时后调用Redis的key回调方法,拿到value值,判断订单状态。

3.根据订单状态,做业务处理。

具体操作

1.Redis配置文件开启key过期回调

2.在项目中建立文件夹,加入监听类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RidesConfig {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;//redis连接池

    @Bean
    public ChannelTopic expiredTopic() {
        return new ChannelTopic("__keyevent@0__:expired");  // 选择0号数据库
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        System.out.println("============================Redis初始化配置2============================");
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }
}

3.在项目中建立文件夹,重写失效回调方法,拿到过期key,做业务处理

import com.ruixin.common.utils.DateUtils;
import com.ruixin.common.utils.StringUtils;
import com.ruixin.goodsMainOrder.domain.SscGoodsMainOrder;
import com.ruixin.util.goodsOrderTaskUtil;
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 RedisSubService extends KeyExpirationEventMessageListener {

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

    //回调到这个方法
    @Override
    public void onMessage(Message message, byte[] pattern) {
        super.onMessage(message, pattern);
        String keyExpira = message.toString();
        System.out.println("拿到过期key ,处理业务逻辑======" + keyExpira);
        //拿到过期key ,处理业务逻辑
        if (StringUtils.isNotNull(keyExpira) && StringUtils.isNotEmpty(keyExpira)) {
            String[] keyStr = keyExpira.split(":");
            if (keyStr[0].equals("main_order_nums")) {
                System.out.println("拿到的主订单号为:" + keyStr[1]);
                SscGoodsMainOrder goodsMainOrder = new SscGoodsMainOrder();
                goodsMainOrder.setMainOrderNum(keyStr[1]);
                goodsMainOrder.setOrderStatus("4");
                goodsMainOrder.setCancelReason("TimeOut");
                goodsMainOrder.setCancelTime(DateUtils.getNowDate());
                goodsOrderTaskUtil.updateMain(goodsMainOrder);
            }
        }
    }


}

4.测试可用性(注:配置完第一步,需要重启Redis)

存入Redis缓存,存入时传入以下四个参数 
key(0号库文件夹名称+订单号),value(字符串+订单号),过期时间,时间单位(分钟)

 

举报

相关推荐

0 条评论