• 6.01 定时任务,关闭超时订单


    步骤1:创建定时任务类

    import com.imooc.service.OrderService;
    import com.imooc.utils.DateUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class OrderJob {
        @Autowired
        private OrderService orderService;
    
        /**
         * 使用定时任务关闭超期未支付订单,会存在的弊端:
         * 1. 会有时间差,程序不严谨
         *      10:39下单,11:00检查不足1小时,12:00检查,超过1小时多余39分钟
         * 2. 不支持集群
         *      单机没毛病,使用集群后,就会有多个定时任务
         *      解决方案:只使用一台计算机节点,单独用来运行所有的定时任务
         * 3. 会对数据库全表搜索,及其影响数据库性能:select * from order where orderStatus = 10;
         * 定时任务,仅仅只适用于小型轻量级项目,传统项目
         *
         * 后续课程会涉及到消息队列:MQ-> RabbitMQ, RocketMQ, Kafka, ZeroMQ...
         *      延时任务(队列)
         *      10:12分下单的,未付款(10)状态,11:12分检查,如果当前状态还是10,则直接关闭订单即可
         */
    
        @Scheduled(cron = "0/3 * * * * ?")
        public void autoCloseOrder() {
            orderService.closeOrder();
            System.out.println("执行定时任务,当前时间为:"
                    + DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN));
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    步骤2:开启定时任务

    @EnableScheduling // 开启定时任务
    
    • 1

    步骤3:超时订单改成关闭状态
    1.OrderService接口中

    /**
     * 关闭超时未支付订单
     */
    public void closeOrder();
    
    • 1
    • 2
    • 3
    • 4

    2.OrderService实现类中

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void closeOrder() {
    	// 查询所有未付款订单,判断时间是否超时(1天),超时则关闭交易
    	OrderStatus queryOrder = new OrderStatus();
    	queryOrder.setOrderStatus(OrderStatusEnum.WAIT_PAY.type);
    	List<OrderStatus> list = orderStatusMapper.select(queryOrder);
    	for (OrderStatus os : list) {
    		// 获得订单创建时间
    		Date createdTime = os.getCreatedTime();
    		// 和当前时间进行对比
    		int days = DateUtil.daysBetween(createdTime, new Date());
    		if (days >= 1) {
    			// 超过1天,关闭订单
    			doCloseOrder(os.getOrderId());
    		}
    	}
    }
    
    @Transactional(propagation = Propagation.REQUIRED)
    void doCloseOrder(String orderId) {
    	OrderStatus close = new OrderStatus();
    	close.setOrderId(orderId);
    	close.setOrderStatus(OrderStatusEnum.CLOSE.type);
    	close.setCloseTime(new Date());
    	orderStatusMapper.updateByPrimaryKeySelective(close);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    知识图谱-Neo4j使用详解
    Python实现---南邮离散数学实验四:图的生成及欧拉(回)路的确定
    A34 STM32_HAL库函数 之 PCCARD通用驱动 所有函数的介绍及使用
    hdu 3549 Flow Problem(最大流模板题)
    一文了解 DataLeap 中的 Notebook
    研究生常用工具
    获取Map中指定key值进行处理方法
    基于springboot+vue的食品安全管理系统(源码+论文)
    手把手带你体验一场属于Linux的学习之旅
    通信达行情接口有什么用?
  • 原文地址:https://blog.csdn.net/jinhuding/article/details/133690399