java定时任务调度工具-quartz

来源:互联网 发布:弯刀对着瓢切菜 知乎 编辑:程序博客网 时间:2024/05/24 06:50

一.核心概念

调度器:执行任务

任务:任务的业务逻辑

触发器:执行任务的时间

二.体系结构

JobDetail :任务描述,装载任务的详细业务逻辑

trigger :触发器,规定任务详细的触发规则

scheduler:任务表,装载JobDetail和trigger,执行任务

三.hello quartz

1.添加maven依赖

<dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz</artifactId>    <version>2.2.3</version></dependency>
2.创建一个Job

public class HelloJob implements Job{    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        //所需实现的业务逻辑       Date time = new Date();        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");        System.out.println(sdf.format(time));        System.out.println("hello quartz");    }}
3.创建一个scheduler

public class HelloScheduler {    public static void main(String[] args) throws SchedulerException {        //创建任务       JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("first_quartz", "group_one").build();        /**           创建触发器            startNow()立即启动            withIntervalInSeconds()间隔多少时间调度任务,单位秒            repeatForever()重复循环任务        */       Trigger trigger = TriggerBuilder.newTrigger().withIdentity("first_quartz_trigger", "group_one").         startNow().withSchedule(                SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()        ).build();        //创建调度器       SchedulerFactory schedulerFactory = new StdSchedulerFactory();        Scheduler scheduler = schedulerFactory.getScheduler();        scheduler.scheduleJob(jobDetail, trigger);        scheduler.start();    }}
四.浅谈Job与JobDetail

Job:实现业务逻辑的任务接口

Job在quartz中的生命周期

      每次调度器执行job时,它在调用execute方法前会创建一个新的job实例。当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。

JobDetail

      JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail来添加Job实例。

JobDetail属性     

     name:任务的名字

     group:任务所在的组

     jobClass:任务的映射

    jobDataMap:任务的参数集合

JobDetail部分方法

    jobDetail.getKey().getName();    获取名字

    jobDetail.getKey().getGroup();    获取组名

    jobDetail.getJobClass();   获取job

五.浅谈JobExecutionContext和JobDataMap

1.JobExecutionContext:

     当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execution()方法;

     Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。

2.JobDataMap:

     在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取;

     JobDataMap可以用来装载任何可序列化的数据对象,当Job实例对象被执行时这些参数对象会传递给它;

     JobDataMap实现了JDK的map接口,并且添加了其他的存储基本数据类型。

3.获取JobDataMap的两种方式

      传参    

JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("first_quartz", "group_one")        .usingJobData("jobDetail_message", "jobDetail_message")        .usingJobData("jobDetail_number",3.14).build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("first_quartz_trigger", "group_one").        usingJobData("trigger_message", "trigger_message")        .usingJobData("trigger_number", 1314d).startNow().withSchedule(        SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();

     从map中获取 

//若map中的key相同,则优先打印trigger中的valueJobDataMap jobDataMap = jobExecutionContext.getMergedJobDataMap();String jobDetail = jobDataMap.getString("jobDetail_message");String trigger = jobDataMap.getString("trigger_message");
     通过setter和getter注入(Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动地调用这些setter方法)
private double jobDetail_number;private double trigger_number;public double getJobDetail_number() {    return jobDetail_number;}public void setJobDetail_number(double jobDetail_number) {    this.jobDetail_number = jobDetail_number;}public double getTrigger_number() {    return trigger_number;}public void setTrigger_number(double trigger_number) {    this.trigger_number = trigger_number;}
六.触发器

触发器的通用属性:

1.jobkey:标识job实例的标识,触发器被触发时,该指定的job实例会执行。

2.startTime:表示触发器的时间表首次被触发的时间。

3.endTime:表示触发器不再被触发的时间。

//TriggerTrigger trigger = TriggerBuilder.newTrigger().withIdentity("first_quartz_trigger", "group_one").        startAt(start).endAt(end).withSchedule(        SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
//JobTrigger trigger1 = jobExecutionContext.getTrigger();System.out.println("startTime" + trigger1.getStartTime());System.out.println("endTime" + trigger1.getEndTime());JobKey jobKey = trigger1.getJobKey();
System.out.println(jobKey.getName() + " : "+ jobKey.getGroup());

原创粉丝点击