java订单超时取消设计_Redis过期监听——订单超时-取消

java订单超时取消设计_Redis过期监听——订单超时-取消_第1张图片

最近在做电商项目,涉及支付超时处理的几种方式。【记录哈使用redis监听处理】

提交订单的时候,支付-超过了有效时间则支付状态自动更新为已取消。

欢迎交流

redis过期监听的实现:

1.修改redis.windows.conf配置文件中notify-keyspace-events的值

默认配置notify-keyspace-events的值为 ""

修改为 notify-keyspace-events Ex 这样便开启了过期事件

2. 创建配置类RedisListenerConfig(配置RedisMessageListenerContainer这个Bean)

package com.zjt.shop.config;

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.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * 作者:zhuLin
 * 日期:2020-08-21 11:48
 * 备注:redis监听配置
 */

@Configuration
public class RedisListenerConfig {
      

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 处理乱码
     * @return
     */
    @Bean
    public RedisTemplate redisTemplateInit() {
      

        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //val实例化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
      
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

}

3.继承KeyExpirationEventMessageListener创建redis过期事件的监听类

package com.zjt.shop.common.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zjt.shop.modules.order.service.OrderInfoService;
import com.zjt.shop.modules.product.entity.OrderInfoEntity;
import com.zjt.shop.modules.product.mapper.OrderInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;

/**
 * 作者:zhuLin
 * 日期:2020-08-21 11:51
 * 备注:redis数据失效事件
 */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
      

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

    @Autowired
    private OrderInfoMapper orderInfoMapper;

    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
      
      try {
      
          String key = message.toString();
          //从失效key中筛选代表订单失效的key
          if (key != null && key.startsWith("order_")) {
      
              //截取订单号,查询订单,如果是未支付状态则为-取消订单
              String orderNo = key.substring(6);
              QueryWrapper queryWrapper = new QueryWrapper<>();
              queryWrapper.eq("order_no",orderNo);
              OrderInfoEntity orderInfo = orderInfoMapper.selectOne(queryWrapper);
              if (orderInfo != null) {
      
                  if (orderInfo.getOrderState() == 0) {
         //待支付
                      orderInfo.setOrderState(4);         //已取消
                      orderInfoMapper.updateById(orderInfo);
                      log.info("订单号为【" + orderNo + "】超时未支付-自动修改为已取消状态");
                  }
              }
          }
      } catch (Exception e) {
      
          e.printStackTrace();
          log.error("【修改支付订单过期状态异常】:" + e.getMessage());
      }
    }
}

4:测试

通过redis客户端存一个有效时间为3s的订单:

e1832bb8b914274681b7ce7e482a2755.png

结果:

java订单超时取消设计_Redis过期监听——订单超时-取消_第2张图片

你可能感兴趣的:(java订单超时取消设计)