在电商上购买商品后,未付款下单,一般会提示30分钟内完成付款,否则订单自动。例如,在JD.COM下订单时,付款没有完成:
超过24小时后,订单将自动取消。这里用Java定时器来实现超时取消功能。
TimerTask是一个抽象类,它实现Runnable,这意味着创建多线程任务。
创建 TimerTaskTimerTask是一个抽象类。抽象是为了代码重用。要创建继承TimerTask的类:
公共类CancelOrderTimeTask扩展TimerTask { 私有长id; public CancelOrderTimeTask(long id){ this . id = id; } @ override public void run(){ //执行取消订单 cancel order(id); system . out . println(getCurrentTime()+& # 34;取消订单的时间,订单ID:& # 34;+id); } private String get current time(){ simple date format SDF = new simple date format(); SDF . apply pattern(& # 34;yyyy-MM-DD HH:MM:ss & # 34;); Date Date = new Date(); return SDF . format(date); } }在run方法中执行订单取消任务。
因为这个方法不是创建bean,所以在调用dao或者其他bean的时候,应该使用ApplicationContext来获取bean。
Timer 定时器调用 TimerTask创建一个新的计时器,由schedule方法调用。该方法有两个参数。第一个是任务的实例,另一个是延迟多长时间调用任务,单位是毫秒。代码如下:
@ rest controller 公共类timer controller { @ get mapping(& # 34;/timer & # 34;) 公共字符串Timer(long id){ Timer Timer = new Timer(); CancelOrderTimeTask time task = new CancelOrderTimeTask(id); system . out . println(& # 34;当前时间是& # 34;+getCurrentTime());[/h //10秒内执行任务 timer.schedule(时间任务,10 * 1000); return & # 34;好& # 34;; } private String get current time(){ simple date format SDF = new simple date format(); SDF . apply pattern(& # 34;yyyy-MM-DD HH:MM:ss & # 34;); Date Date = new Date(); return SDF . format(date); } } 调用方法后,控制台输出以下内容,表示预定调用成功。
当前时间为2022-01-24 00:05:09 2022-01-24 00:05:19。Order ID: 3 Summary 首先创建一个调度任务,继承TimerTask,在run方法中编写业务逻辑。
Github源代码