首页 > 技术文章 > Spring Schedule定时关单快速入门(二)

zcl1116 2021-01-28 22:27 原文

配置定时关闭订单

1.编辑Spring配置文件 添加上内容



2.创建定时关单类

//--------------------------------------------------------------

在v1版本中,我们采用普通的定时器,(这种设计模式下的定时器可以解决普通的单tomcat服务器项目)

代码:

//非集群项目使用该定时器
@Scheduled(cron = "0 */1 * * * ?")//每1分钟(每个1分钟的整数倍)调用一次
public void closeOrderTaskV1(){
    log.info("关闭订单定时任务启动");

    int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));
    iOrderService.closeOrder(hour);//关闭2小时以前没支付的订单.

    log.info("关闭订单定时任务结束");

}
private void closeOrder(String lockName){
    RedisShardedPoolUtil.expire(lockName,5);//设置key的有效期为50秒,防止死锁
    log.info("获取{},ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());//打印日志(1.锁名 2.当前线程的名字)
    int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));
    //iOrderService.closeOrder(hour);//关闭2小时以前没支付的订单.
    RedisShardedPoolUtil.del(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
    log.info("释放{},ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());//打印日志(1.锁名 2.当前线程的名字)
    log.info("==================================");

}

//-------------------------------------------------------------

注意:以上方法在普通项目上运行并没问题,但是在Tomcat集群的项目中运行时,我们会发现每到时间所有集群的Tomcat都会执行定时器。

定时器中运行的代码涉及数据库的访问,此时定时器会浪费了Mysql和服务器的性能,且容易造成数据的错乱。

这并不是我们需要的,我们只需要到时间只一台Tomcat执行定时器。

推荐阅读