在最近工作中遇到一个业务,在每天的凌晨定时触发一个任务,产生相应的当天数据,这一块是使用springboot+quartz实现的,这个简单说一下,引入相关依赖,在需要执行的类上实现Task这个类,这个类也是quartz自带的,重新run方法后即可,在后台配置相关定时任务调度就可以了。我的业务是在当前的这个定时任务中增加一个动态的定时任务,此任务主要是动态定时给系统发送通知,主要实现如下:
第一步:
在项目的springboot启动类上加上 @EnableScheduling这个开启任务的注解。
第二步:
使用 Executors.newScheduledThreadPool(20);以线程池的方式去定义一个任务线程池,api里面的方法很多,只要理解意思开发起来就很容易:
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(25);
//间隔多长时间触发
String sendMassageTime =
getTimeMassage(mesEquipmentCheckTaskDTO.getPlanCheckTime(), -
Integer.parseInt(mesEquipmentCheckDTO.getRemindTime()));
long startTime = sdf.parse(sendMassageTime).getTime()
System.currentTimeMillis();
//这里将时间换算为分钟
startTime = startTime / 1000 / 60;
scheduledExecutorService.schedule(new ScheduleTask(mesEquipment.getOfficeId(),mesEquipment.getEquipmentCode())
,startTime,TimeUnit.MINUTES);
scheduledExecutorService.shutdown();
创建好定时任务线程池之后,使用 scheduledExecutorService.schedule(1,2,3)这个API来启动相应的任务参数1:代表你的定时任务类,2:相隔多长时间执行目标方法,3:执行单位是什么。
没执行一次记得shutdown()及时关闭资源
第三步:创建自己所要触发的线程类,也就是你要执行的定时任务逻辑代码。
任务类的方式还是和普通创建定时任务是一样的,第一种继承Thread后重写run方法,第二种实现Runnable接口,依然重写run方法,如果你需要你的任务有返回值的话,可以实现Callable接口,配合Future拿到结果返回值,我这里使用了实现Runnable接口,采用匿名内部类的方式:
class ScheduleTask implements Runnable {
private String officeId;
private String code;
public ScheduleTask(String officeId,String code) {
this.officeId = officeId;
this.code = code;
}
@Override
public void run() {
// 定时发送消息
这里是具体的逻辑代码快......
}
类中的两个属性值是我要用到的,所以在内部类中构建了一个全参构造,可以通过上面第二步new内部类的时候传入参数,这里就可以使用了。
这样就可以简单实现动态时间触发你的任务类了,如果想使用更多的任务方法,其实大家可以参考quartz这个强大的任务调度框架,总之能实现相应的功能就行。
简单记录一下,如果有什么错误的地方,可以留言。