定时任务是JAVA后台开发需要使用到的技术,比如定时执行发送邮件的通知,定时做数据同步,定时统计一些数据分析,实现定时任务的方式有JAVA原生的方式,有第三方依赖库的实现还有框架的实现。现在列举以下五种主流的方式:
1、JAVA原生的Timer类,早期就有的方法
Timertimer=newTimer(); timer.schedule(newTimerTask() { publicvoidrun() { //do something } }, delay);
2、JAVA原生的ScheduledExecutorService实现,这个是并发包里的
ScheduledExecutorServiceexecutorService=Executors.newScheduledThreadPool(1); executorService.schedule(newRunnable() { publicvoidrun() { //do something } }, delay, TimeUnit.MILLISECONDS);
3、Quartz第三方库,支持作业管理,可以删除定时任务,开启定时任务,操作很丰富,很多现在封装的XXX-job底层就是使用这个玩意,功能很强大
JobDetailjobDetail=JobBuilder.newJob(MyJob.class).withIdentity("jobName", "jobGroup").build(); Triggertrigger=TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroup") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()) .build(); SchedulerFactoryschedulerFactory=newStdSchedulerFactory(); Schedulerscheduler=schedulerFactory.getScheduler(); scheduler.start(); scheduler.scheduleJob(jobDetail, trigger);
4、Spring自带的
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> @Component public class MyTask { @Scheduled(cron = "0 0/5 * * * ?") public void run() { // do something } } @EnableScheduling //别忘了在启动类上加这个注解,表示开启定时任务
5、Spring+quartz这里面可以直接使用SpringBoot+quartz,引入spring-boot-starter-quartz快速集成即可
importorg.quartz.*; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; publicclassTaskConfig { publicJobDetailjobDetail() { returnJobBuilder.newJob(Job.class) .withIdentity("JobName") .withDescription("JobDescription") .build(); } publicTriggertrigger() { returnTriggerBuilder.newTrigger() .forJob(jobDetail()) //这里面可以使用各种定时任务规则,有简单的,Cron的 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)) .build(); } }
如果对定时任务没有管理要求,只是简单的定时触发或者指定时间触发,一般Spring自带的就可以满足。