我在日常工作中经常和计时任务打交道。我们使用的是自己实现的分布式定时任务,但是一开始直接过渡到分布式定时任务并不容易,我们先从单机定时任务框架学习一下。这次选择的定时任务框架是Java领域比较知名的Quartz框架。[TOC]如何让这个方法定时执行在这篇文章中,我们只有一个诉求,如何让我们的方法在指定的时间点开始执行。首先我们引入Quartz的依赖:org.quartz-schedulerquartz2.3.2下面是Quartz的示例publicclassHelloJobimplementsJob{@Overridepublicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{JobDetailjobTetail=jobExecutionContext.getJobDetail();System.out.println("你好世界------");}}publicstaticvoidmain(String[]args)throwsSchedulerException{SchedulerFactoryschedFact=newStdSchedulerFactory();调度程序sched=schedFact.getScheduler();计划开始();//定义作业并将其绑定到我们的HelloJob类JobDetailjob=newJob(HelloJob.class).withIdentity("myJob","group1").build();//触发作业现在运行,然后每40秒触发一次rtrigger=newTrigger().withIdentity("myTrigger","group1")//将触发器放入组中。startNow()//现在开始。withSchedule(simpleSchedule().withIntervalInSeconds(1)//执行频率.repeatForever())//重复执行.build();//告诉石英使用我们的触发器安排作业sched.scheduleJob(job,trigger);如上图所示,我们实现了HelloJob中的execute方法每秒执行一次。我们通过上面这个简单的例子来了解一下Quartz中的一些基本概念:触发定时任务的定时逻辑:在特定时间后开始触发或者开始触发withSchedule来定义执行频率和执行次数。好像可以大致理解为scheduler每时每刻都在轮询是否满足trigger的条件,如果满足则执行HelloJob中的方法。这是一个非常直观清晰的框架图。Quartz给定时任务添加一些描述信息:到现在为止,我们的问题已经得到满足,但我们不仅仅满足于此,我们希望定时任务按照cron来表达(cron表达式来指定要执行的任务在某个时间点或者周期性地)执行,simpleSchedule是SimpleScheduleBuilder的一个静态方法,我们大致看一下SimpleScheduleBuilder的基本结构:是不是所有的Quartz调度器中都有这种可能,builder都是ScheduleBuilder的子类吗?让我们简单地使用它:publicstaticvoidmain(String[]args)throwsSchedulerException{SchedulerFactoryschedFact=newStdSchedulerFactory();调度程序sched=schedFact.getScheduler();计划开始();//定义作业并将其绑定到我们的HelloJob类JobDetailjob=newJob(HelloJob.class).withIdentity("myJob","group1").build();//立即触发作业运行,然后每40秒运行一次Triggertrigger=newTrigger().withIdentity("myTrigger","group1").startNow().withSchedule(cronSchedule(""))//只需填写cron表达式。建造();//告诉quartz使用我们的触发器sched.sc安排作业heduleJob(job,trigger);}接下来我们看一下Quartz与SpringBoot集成Quartz集成SpringBoot还记得SpringBoot集成其他框架的步骤吗?先找到starter,我们尽量不看其他博客,看官方文档能不能完成集成:这次只取我们需要的。从上面的描述我们可以看出Scheduler已经由Spring构建。我们只需要定义触发器和任务就可以自动关联调度器。官方的例子是实现QuartzJobBe@ComponentpublicclassHelloJobextendsQuartzJobBean{//这里写定时任务的处理逻辑//然后我们在IOC容器中添加JobDetail和Trigger@OverrideprotectedvoidexecuteInternal(JobExecutionContextcontext)throwsJobExecutionException{System.out.println("你好世界");}}@ConfigurationpublicclassJobConfiguration{@Value("${cron:*/5****?}")privateStringvalueCron;@BeanpublicJobDetailbuildJobDetail(){}@BeanpublicTriggerbuildTrigger(){Triggertrigger=newTrigger().withIdentity("myTrigger","group1").startNow().withSchedule(cronSchedule(valueCron)).forJob("unique")//关联任务和触发器。建造();返回触发器;}}延迟执行有时我们的要求可能不是那么高,不值得以Quartz为例,如果我们想延迟执行,执行一次,就没必要开战。JDK内置了这样一个轻量级的定时任务组件:privatestaticfinalScheduledExecutorServicescheduledExecutorService=Executors.newScheduledThreadPool(10);//延时一个秒后再次执行publicvoidstudySchedule(){scheduledExecutorService.schedule(()->{System.out.println("helloworld");},1,TimeUnit.SECONDS);}参考资料简洁明了理解cron表达式https://zhuanlan.zhihu.com/p/...