订单超时取消:当用户成功提交订单之后在规定时间内如果没有完成支付,则将订单关闭,还原库存。
实现订单的超时取消通常有两种解决方案:
1.使用定时任务(循环扫描)(quartz)
2.延时队列(MQ)
一、流程分析

 二、实现

1.在service中的pom.xml中添加定时任务依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2.在api子工程启动类中添加启动定时任务的注解@EnableScheduling

@EnableScheduling
@SpringBootApplication
@MapperScan("com.qfedu.fmmall.dao")
public class ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

}
 3.在service包下新建job包

 job包下新建OrderTimeoutCheckJob类。

 OrderTimeoutCheckJob:
@Component
public class OrderTimeoutCheckJob {
    
    @Autowired
    private OrdersMapper ordersMapper;
    
    @Scheduled(cron = "0/5 * * * * ?")
    public void checkAndCloseOrder(){
        //1.查询超过30分钟,订单状态依然为待支付状态的订单
        Example example = new Example(Orders.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("status","1");

        Date time = new Date(System.currentTimeMillis() - 30*60*1000);
        criteria.andLessThan("createTime",time);

        List<Orders> orders = ordersMapper.selectByExample(example);

    }
}

4.测试:

    @Autowired
    private OrdersMapper ordersMapper;

   @Test
    public void test(){
        Example example = new Example(Orders.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("status","1");

        Date time = new Date(System.currentTimeMillis() - 30*60*1000);
        criteria.andLessThan("createTime",time);

        List<Orders> orders = ordersMapper.selectByExample(example);
     for (int i = 0; i < orders.size(); i++) {
        System.out.println(orders.get(i).getOrderId()+"\t"
+orders.get(i).getCreateTime()+"\t"+orders.get(i).getStatus());
}

}
 

 测试成功!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐