Quartz学习(1)

来源:互联网 发布:苹果手机 数据恢复 编辑:程序博客网 时间:2024/06/07 09:04

Quartz简介

     Quartz是一个完全由java编写的开源作业调度框架。是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。

     所谓作业调度,就是在某个时间自动执行某个我们需要执行的任务,比如我们打卡,每天晚上12点的时候检查在今天一天是否有没有某个员工没有按时上班或者早退,怎么检查呢,可以每晚12时去查询员工上班的打卡记录,如果记录为空的话,或者打卡时间超过了我们上班的时间,我们就将其员工的今天状态置为异常,那么每晚那个时候主动的去执行上面的任务呢?Quartz给了我们一个很好的答案。

如何开始一个Quartz的HelloWorld

我们的要求:从当前时间开始,每秒执行一次HelloWorld

   首先,我们使用eclipse+maven创建项目


一直next,选择quickstart



最后输入group-id和artifict-id,这样我们就完成了一个项目的创建


导入quartz的jar包,由于是maven管理,它会自动的帮我导入其依赖包

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

Quartz需要注意的三个组件,即Job(任务),即我们要执行打印HelloWorld,trigger(触发器)即每秒执行一次,Scheduler(调度器),连接任务和触发器到一起,并开始执行它。


那我们可以开始创建一个任务,任务需要继承Job接口,并实现其execute方法,

package com.biglei.quartzTest;


import java.text.SimpleDateFormat;
import java.util.Date;


import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


public class MyJob implements Job{


public void execute(JobExecutionContext arg0) throws JobExecutionException {
//记录开始的时间,格式为2017-11-20 23:15:30这样

//每执行一次任务,都会打印一次时间
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
//我们的任务
System.out.println("hello world");
}


}

然后进行测试:

package com.biglei.quartzTest;


import java.text.SimpleDateFormat;
import java.util.Date;


import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;


public class Test {


public static void main(String[] args) throws SchedulerException {

//1.任务
//通过构建器模式实例化我们我们需要执行的任务
//withIdentity是为这个任务创建一个名称和组
//连缀调用
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("JobName", "group1").build();

//2.触发器
//和任务一样,也是构建器模式,withIdentity为这个触发器创建一个名称和组
//withSchedule 主要使用两种触发器两种类型的触发器,我们这个程序为第一种
//(1)SimpleTrigger – 允许设置开始时间,结束时间,重复间隔。
//withIntervalInSeconds 表示每1秒执行  repeatForever()表示重复执行
//(2)CronTrigger – 允许UNIX cron表达式来指定日期和时间来运行作业。
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("TriggerName", "group1")
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1).repeatForever())
.build();

//3.调度器,采用工厂模式,连接任务和触发器到一起
//start 执行此调度器
Scheduler scheduler = new StdSchedulerFactory().getScheduler();

//开始任务开始执行的时间
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));

    scheduler.start();
    scheduler.scheduleJob(job, trigger);
}
}

我们可以再次的分析一下流程,首先,进入主函数,创建一个任务,为其设置名字与组,然后创建一份触发器,设置为每秒执行,怎么将这两个结合到一起的呢?我们的调度器就应运而生,将任务和触发器连接到一起,打印此时时间,并开启调度器,用语文来说,就是从现在开始,每隔一秒执行一次任务(进入任务后每执行一次会打印一次时间),然后,下面的结果就出来