Quartz是一个特性丰富的,开源的任务调度库。它几乎可以被集成到任何java应用中,从最小的单体应用到大型的企业级系统。
Quartz可支持数千个任务的简单或者复杂的调度,支持集群和JTA事务。
Quartz用起来很简单,示例如下。
pom.xml配置如下:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
测试类:
public class CronHelloJobTest {
public static void main(String[] args) throws SchedulerException {
Logger log = LoggerFactory.getLogger(LoadExample.class);
//创建一个scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.getContext().put("skey", "svalue");
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger3", "mygroup")
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * 8-23 * * ?"))
//.forJob("myJob", "mygroup")
.build();
//创建一个job
JobDetail job = JobBuilder.newJob(JobHello.class)
.usingJobData("j1", "jv1")
.withIdentity("myjob", "mygroup").build();
job.getJobDataMap().put("j2", "jv2");
//注册trigger并启动scheduler
scheduler.scheduleJob(job,trigger);
scheduler.start();
log.info("--- start execute job---");
try {
Thread.sleep(18000);
} catch (InterruptedException e) {
e.printStackTrace();
}
JobKey jobKey = new JobKey("myjob", "mygroup");
log.info("--- start delete job---");
scheduler.deleteJob(jobKey);
log.info("--- end delete job---");
}}
具体任务类:
public class JobHello implements Job {
private static final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
@Override
public void execute(JobExecutionContext arg) throws JobExecutionException {
System.out.println(JobHello.format.format(new Date())+" "+"hello world!");
}}
具体任务类实现Job接口,表示具体执行的任务。
JobDetail在具体任务类的基础上定义了一些属性。
CronTrigger是cron格式的触发器,Quartz还支持指定时间间隔,指定执行次数形式的触发器。