使用Timer和TimerTask可以实现很简单的任务调度。如果遇到比较复杂的,推荐使用quartz,石英表。QUARTZ称为任务调度框架。这个框架由四大部分组成:
1、Scheduler:调度器,控制所有的调度;
2、Trigger:触发条件,采用DSL模式;
3、JobDetail:需要处理的JOB;
4、Job:执行逻辑;
【这个框架已经集成到高级框架Spring里面了,后期一定会遇到它,重点关注这四个部分】
在我们用Trigger和JobDetail的时候我们会遇到一个模式叫流模式,就是不断的点点点,这个模式实际上叫DSL模式,这个DSL模式叫领域特定语言或者领域专用语言,意思就是用简洁的代码来表示特殊的含义,来快速解决特殊的问题。比如说StringBuilder里面的append,看过源码就知道它里面返回的是this,有了这个this就可以不断的点下去,那我们就不需要接收这个对象的引用了,可以多次操作。
这个流模式叫做Method Chaining方法链,它内部有一个builder,这个DSL模式还有另外的实现,比如说:
QUARTZ如何获得呢?
需要从官网www.quartz-scheduler.org获得,不过要借助VPN。
在遇到一个新的知识、框架的时候,看它的API,看它的文档或者使用手册,也可以参考它写好的示例。
建议quartz不要自己去写,直接去拷贝写好的example。
package com.sxt.others;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 任务
*
* @author
*
*/
public class HelloJob implements Job {
public HelloJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("-------start---------");
System.out.println("Hello World! - " + new Date());
System.out.println("-------end---------");
}
}
package com.sxt.others;
import static org.quartz.DateBuilder.evenSecondDateAfterNow;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
/**
* quartz学习入门
* @author
*
*/
public class Quartz{
public void run() throws Exception {
// 1、创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
// 2、从工厂中获取调度器
Scheduler sched = sf.getScheduler();
// 3、创建JobDtail
JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
// 时间
Date runTime = evenSecondDateAfterNow();
// 4、触发条件
//Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
Trigger tigger = newTigger().withldentity("tigger1","group1").startAt(runTime)
.withSchedule(simpleSchedule().withlntervallnSeconds(5).withRepeatCount(3)).build();
// 5、注册任务和触发条件
sched.scheduleJob(job, trigger);
// 6、启动
sched.start();
try {
// 100秒后停止
Thread.sleep(100L * 1000L);
} catch (Exception e) {
}
sched.shutdown(true);
}
public static void main(String[] args) throws Exception {
QuartzTest example = new QuartzTest();
example.run();
}
}