Spring Schedule定时关单快速入门(二)
配置定时关闭订单
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执行定时器。
日拱一卒无有尽,功不唐捐终入海