定制任务计划可以采取两种方式:
1、使用Java自带的Timer定时器。
2、使用Quartz定时器框架。
1.1 Timer
1.1.1 Timer
在 Java 中提供了 Timer 定时器,用于间隔一定时间期内,自动运行某程序的功能。
编写 Timer 需要 extends TimerTask 实现 public void run() 方法。
Timer 定时器的调用:
Timer t = new Timer();
t.scheduleAtFixedRate( new HelloWorldTask(), 1000, 3000);
task - task to be scheduled.
delay - delay in milliseconds before task is to be executed.
period - time in milliseconds between successive task executions
1.1.2 集成 Spring
在 Spring 框架中提供了支持 Timer 的相关方法,方便用户使用 Spring 管理 Timer 定时器。
声明 Timer 定时器:
< bean id = "job" class = "" />
添加计划任务:
( delay :延迟启动时间、 period: 时间间隔期、 timerTask :启动的任务)
< bean id = "timerTask" class = "org.springframework.scheduling.timer.ScheduledTimerTask" >
< property name = "delay" value = "1000" />
< property name = "period" value = "3000" />
< property name = "timerTask" ref = "job" />
</ bean >
启动定时器 :
< bean id = "timerFactory" class = "org.springframework.scheduling.timer.TimerFactoryBean" >
< property name = "scheduledTimerTasks" >
< list >
< ref local = "timerTask" />
</ list >
</ property >
</ bean >
1.2 Quartz
Timer 定时器只是为我们提供了间隔一段时间运行某一程序的功能,但是当我们需要在具体的时间运行执行某一程序时, Timer 就显得力不从心,不过幸运的是我们有 Quartz 。
1.2.1 Quartz
Quartz 开发流程:
implements Job 实现 public void execute(JobExecutionContext context) 方法
使用工厂方法创建 Scheduler:
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
创建任务明细 :
JobDetail job = new JobDetail( "job1" , "group1" , HelloWorldJob. class );
创建触发器:
SimpleTrigger trigger = new SimpleTrigger( "trigger1" , "group1" , runTime);
Scheduler 的 scheduleJob(job, trigger) 方法将 JobDetail 、 Trigger 整合; start()/shutdown() 开启任务计划。
1.2.2 集成 Spring
Quartz 同 Spring 整合有两种方式:
SimpleTrigger (间隔一段时间运行某一程序)
CronTrigger (指定某一具体时间运行某一程序)
1.2.2.1 SimpleTrigger
自定义 Job 类 extends QuartzJobBean 实现 executeInternal(JobExecutionContext context) 方法
Spring 配置文件:
JobDetailBean 继承于 Quartz 的 JobDetail
< bean id = "reportJob" class = "org.springframework.scheduling.quartz.JobDetailBean" >
< property name = "jobClass"/ >
</ bean >
声明 SimpleTriggerBean ,里面包含 jobDetails,startDelay,repeatInterval 等属性
< bean id = "simpleReportTrigger" class = "org.springframework.scheduling.quartz.SimpleTriggerBean" >
< property name = "jobDetail" ref = "reportJob" />
< property name = "startDelay" value = "60000" />
< property name = "repeatInterval" value = "60000" />
</ bean >
创建 SchedulerFactory ,开启日程计划
< bean class = "org.springframework.scheduling.quartz.SchedulerFactoryBean" >
< property name = "triggers" >
</ bean >
1.2.2.2 CronTrigger
ConTrigger 同 SimpleTrigger 的配置方式基本相同,只不过将 SimpleTrigger 用 ConTrigger 替代。
< bean id = "cronReportTrigger" class = "org.springframework.scheduling.quartz.CronTriggerBean" >
< property name = "jobDetail" ref = "reportJob" />
< property name = "cronExpression" value = "19 0 10 * * ?" />
</ bean >