实战Quartz的Scheduler

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/84187419

一 点睛

1 Scheduler是通过工厂模式创建的。

所有的Scheduler实例由SchedulerFactory来创建。

2 Quartz的三个核心概念

  • 调度器
  • 任务
  • 触发器

3 Scheduler的创建方式

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();

DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance();
Scheduler scheduler1=factory.getScheduler();

4 SchedulerFactory

使用一组参数来创建和初始化Quartz调度器

配置参数一般存储在quartz.properties中

调用getScheduler方法就能创建和初始化调度器对象

5 Scheduler的主要函数

  • Date scheduleJob(JobDetail jobDetail, Trigger trigger):返回最近一次要执行任务的时间
  • void start():启动
  • void standby():暂停
  • void shutdown():完全关闭,不能再重启

二 实战——scheduleJob返回值

1 启动类

package com.quartz;

import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

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

public class HelloScheduler {

    public static void main( String[] args ) throws SchedulerException {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time is:" + simpleDateFormat.format(date));

        //创建一个JobDetail实例, 将该实例与hellojob class 绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();  //演示传递参数


        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("0/5 * 16,18 * * ?"))
                .build();

        //创建Schedule实例
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        //scheduleJob返回的是最近一次要执行的时间
        System.out.println("scheduled time is:"
                + simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));

    }
}

2 测试结果

Current Time is:2018-11-17 14:15:01

scheduled time is:2018-11-17 16:00:00

三 实战——演示standby

1 启动类

package com.quartz;

import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

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

public class HelloScheduler {

    public static void main( String[] args ) throws SchedulerException, InterruptedException {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time is:" + simpleDateFormat.format(date));

        //创建一个JobDetail实例, 将该实例与hellojob class 绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();  //演示传递参数


        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("* * * * * ?"))
                .build();

        //创建Schedule实例
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        //scheduleJob返回的是最近一次要执行的时间
        System.out.println("scheduled time is:"
                + simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
        //sheduler执行两秒后挂起
        Thread.sleep(2000);
        scheduler.standby();

    }
}

2 测试结果

Current Time is:2018-11-17 14:21:40

scheduled time is:2018-11-17 14:21:40

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:21:40

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:21:41

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:21:42

Hello world

四 实战——演示start与standby组合

1 启动类

package com.quartz;

import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

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

public class HelloScheduler {

    public static void main( String[] args ) throws SchedulerException, InterruptedException {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time is:" + simpleDateFormat.format(date));

        //创建一个JobDetail实例, 将该实例与hellojob class 绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();  //演示传递参数


        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("* * * * * ?"))
                .build();

        //创建Schedule实例
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        //scheduleJob返回的是最近一次要执行的时间
        System.out.println("scheduled time is:"
                + simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
        //sheduler执行两秒后挂起
        Thread.sleep(2000);
        scheduler.standby();
        //sheduler挂起3秒后继续执行
        Thread.sleep(3000);
        scheduler.start();
    }
}

2 测试结果

Current Time is:2018-11-17 14:24:34

scheduled time is:2018-11-17 14:24:34

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:34

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:35

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:36

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:39

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:39

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:39

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:40

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:41

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:24:42

Hello world

五 实战——演示shutdown

1 启动类

package com.quartz;

import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

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

public class HelloScheduler {

    public static void main( String[] args ) throws SchedulerException, InterruptedException {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time is:" + simpleDateFormat.format(date));

        //创建一个JobDetail实例, 将该实例与hellojob class 绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();  //演示传递参数


        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("* * * * * ?"))
                .build();

        //创建Schedule实例
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        //scheduleJob返回的是最近一次要执行的时间
        System.out.println("scheduled time is:"
                + simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
        //sheduler执行两秒后停止
        Thread.sleep(2000);
        scheduler.shutdown();
        //sheduler挂起3秒后继续执行
        Thread.sleep(3000);
        scheduler.start();
    }
}

2 测试结果

Current Time is:2018-11-17 14:27:32

scheduled time is:2018-11-17 14:27:32

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:27:32

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:27:33

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:27:34

Hello world

Exception in thread "main" org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called.

    at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:557)

    at org.quartz.impl.StdScheduler.start(StdScheduler.java:142)

    at com.quartz.HelloScheduler.main(HelloScheduler.java:40)

五 实战——演示shutdown(true)

1 启动类

package com.quartz;

import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

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

public class HelloScheduler {

    public static void main( String[] args ) throws SchedulerException, InterruptedException {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Time is:" + simpleDateFormat.format(date));

        //创建一个JobDetail实例, 将该实例与hellojob class 绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();  //演示传递参数


        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("* * * * * ?"))
                .build();

        //创建Schedule实例
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        //scheduleJob返回的是最近一次要执行的时间
        System.out.println("scheduled time is:"
                + simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
        //sheduler执行两秒后停止
        Thread.sleep(2000);
        //shutdown(ture)表示等待所有正在执行的job执行完毕之后,再关闭scheduler
        //shutdown(false)即shutdown()表示直接关闭scheduler,默认为false
        scheduler.shutdown(true); //演示true
        System.out.println("scheduler is shutdown?"+scheduler.isShutdown());
    }
}

2 job类

package com.quartz;

import org.quartz.*;

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


public class HelloJob implements Job{

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印当前执行的时间
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("+++++++++++++++++++++++++++");
        System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
        System.out.println("Hello world");

    }
}

3 测试结果

Current Time is:2018-11-17 14:40:09

scheduled time is:2018-11-17 14:40:09

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:40:14

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:40:15

Hello world

+++++++++++++++++++++++++++

Current Exec Time is:2018-11-17 14:40:16

Hello world

scheduler is shutdown?true

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/84187419