Java定时任务
Java应用程序中,如果想设置定时执行任务,有以下几种方式。
方式 | 特点 |
quartz | 对简单的定时任务太重,支持注解和XML方式 |
Spring的@Scheduled | 配置简单,支持注解和XML方式 |
ScheduledExecutorService | 待考察。 |
Timer | 待考察。 |
本文着重讲quartz和Spring的@Scheduled两种方式。这里通过例子讲解比较直观。如果应用中用到了Spring,建议直接看第二节。
任务:每小时执行一个任务。
1. 通过quartz实现 (不推荐,因为较复杂)
有两个部分,一个是job,另一个是trigger。
job定义实际执行任务:
package quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * Created by linxuan on 3/8/16. */ public class SimpleJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("SimpleJob1"); } }
trigger定义出发方式:
package quartz; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import static org.quartz.CronScheduleBuilder.cronSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; /** * Created by linxuan on 3/8/16. */ public class CronTriggerExample { public static void main(String[] args) throws SchedulerException { SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); JobDetail job = newJob(SimpleJob.class) .withIdentity("job1", "group1") .build(); CronTrigger trigger = newTrigger() .withIdentity("trigger1", "group1") .withSchedule(cronSchedule("0 0 * * * ?")) .build(); sched.scheduleJob(job, trigger); sched.start(); } }
其中cronSchedule("0 0 * * * ?")中用到了cron表达式。对cron表达式不熟悉的,请参考http://linux.vbird.org/linux_basic/0430cron.php。
CronTriggerExample类中出发了SimpleJob。
2. 通过Spring的@Scheduled方式
1) 编写任务类
package com.sankuai.edlp.msg; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * Created by linxuan on 4/26/16. */ @Component public class SimpleJob { @Scheduled(cron = "0 0 * * * ?") public void doit(){ System.out.println("SimpleJob1"); } }
2) 配置文件
在配置文件中添加一行
<!--开启这个配置,扫描到定时任务-->
<task:annotation-driven/>
done! spring中定时任务只需要添加@Scheduled注解和在配置文件中开启配置两步,非常简单。
(完)