以下是 Java 代码实现 30 分钟未支付订单自动取消的逻辑:

  1. 引入 Redis 客户端依赖
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
</dependency>
  1. 创建 Redis 连接池及 Redis 工具类
public class RedisUtil {

    private static JedisPool jedisPool;

    static {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(10);
        jedisPool = new JedisPool(config, 'localhost', 6379, 10000);
    }

    public static Jedis getJedis() {
        return jedisPool.getResource();
    }
}
  1. 在生成订单时,将订单信息存入 Redis,并设置过期时间为 30 分钟
public void createOrder(Order order) {
    // 生成订单
    ...
    // 存入 Redis,设置过期时间为 30 分钟
    Jedis jedis = RedisUtil.getJedis();
    jedis.setex(order.getId(), 1800, order.toString());
    jedis.close();
}
  1. 编写定时任务,在 Redis 中查找所有 30 分钟未支付的订单,并取消订单
public class CancelOrderTask {

    public void cancelOrder() {
        Jedis jedis = RedisUtil.getJedis();
        Set<String> orders = jedis.keys('*');
        for (String orderId : orders) {
            String orderStr = jedis.get(orderId);
            Order order = new Order(orderStr);
            if (order.getStatus() == OrderStatus.UNPAID && System.currentTimeMillis() - order.getCreateTime() > 1800000) {
                // 取消订单
                order.setStatus(OrderStatus.CANCELED);
                jedis.set(orderId, order.toString());
            }
        }
        jedis.close();
    }
}
  1. 使用定时任务框架(如 Quartz)定时执行 cancelOrder 方法
public class QuartzScheduler {

    public void start() throws SchedulerException {
        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler scheduler = sf.getScheduler();
        JobDetail job = JobBuilder.newJob(CancelOrderJob.class).build();
        Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule('0 0/30 * * * ?')).build();
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}
  1. 编写定时任务执行的逻辑
public class CancelOrderJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        CancelOrderTask cancelOrderTask = new CancelOrderTask();
        cancelOrderTask.cancelOrder();
    }
}

以上就是 Java 使用 Redis 实现 30 分钟未支付订单自动取消的完整代码逻辑。

Java 使用 Redis 实现 30 分钟未支付订单自动取消

原文地址: https://www.cveoy.top/t/topic/m8b7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录