Quartz入门

来源:互联网 发布:数据库系统设计 编辑:程序博客网 时间:2024/06/05 07:02

Quartz入门

一.导入依赖


<dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.12</version>    </dependency>    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->    <dependency>      <groupId>org.quartz-scheduler</groupId>      <artifactId>quartz</artifactId>      <version>2.2.1</version>    </dependency>    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->    <dependency>      <groupId>org.apache.logging.log4j</groupId>      <artifactId>log4j-slf4j-impl</artifactId>      <version>2.8.2</version>      <!--<scope>test</scope>-->    </dependency>    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->    <dependency>      <groupId>org.apache.logging.log4j</groupId>      <artifactId>log4j-core</artifactId>      <version>2.8.2</version>    </dependency>  </dependencies>  <build>    <finalName>QuartzSample</finalName>  </build>

二.编写程序


简述:

Quartz体系简述:

Quartz体系结构包含三个核心概念    1. Job: 是一个接口,只定义一个方法execute(JobExecutionContext context),在实现接口的execute方法中编写所需要定时执行的Job(任务), JobExecutionContext类提供了调度应用的一些信息。Job运行时的信息保存在JobDataMap实例中;    2. JobDetail: Quartz每次调度Job时, 都重新创建一个Job实例, 所以它不直接接受一个Job的实例,相反它接收一个Job实现类(JobDetail:描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息),以便运行时通过newInstance()的反射机制实例化Job。     3. Trigger: 是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的15:00~16:00执行调度等;

测试demo简述:

简单的Quartz应用除了线程中调用包含两个类:     1. MyJob.java:定义任务(需要是public)     2. QuartzManager.java:定时器管理类(用来对任务进行操作)

MyJob:

public class MyJob implements Job {    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {        // 格式化输出日期(Date)        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");        System.out.println(simpleDateFormat.format(new Date()));        // 获取任务的具体信息        // 获取任务名        String jobName = jobExecutionContext.getJobDetail().getKey().getName();        // 获取传递的任务参数值        JobDataMap dataMap = jobExecutionContext.getJobDetail().getJobDataMap();        String param = dataMap.getString("param");        System.out.println("传递的参数是: " + param + "; 任务名是: " + jobName);    }}

QuartzManager:

public class QuartzManager {    // 定时器工厂    private static SchedulerFactory factory = new StdSchedulerFactory();    // 设定 任务组(job group) 的名字(随便设定)    private static String JOB_GROUP_NAME = "LZHR_JOBGROUP_NAME";    // 设定 触发器组(trigger group) 的名字(随便设定)    private static String TRIGGER_GROUP_NAME = "LZHR_TRIGGERGROUP_NAME";    // 添加一个job    public static void addJob(String jobName, Class<? extends Job> cls, String time){        try {            Scheduler scheduler = factory.getScheduler();            // 添加一个定时任务            JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName,JOB_GROUP_NAME).build();            // 给任务添加参数, 可以在任务内部获取到.            jobDetail.getJobDataMap().put("param","2222");            // 触发器(2种方式)            // 通过时间表达式创建触发器(具体时间表达式可以看最下方注释)//              time = "0/2 * * * * ?";              Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME)                     .withSchedule(CronScheduleBuilder.cronSchedule(time)).build();            // 普通触发器, 不设定具体时间, 从start开始按设定时间间隔计算.//            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", TRIGGER_GROUP_NAME)//                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(Integer.valueOf(time)).repeatForever()).build();            // 添加到scheduler中            scheduler.scheduleJob(jobDetail,trigger);            // 如果scheduler没有关闭,就启动            if (!scheduler.isShutdown()){                scheduler.start();            }        } catch (SchedulerException e) {            e.printStackTrace();        }    }    // 修改任务的触发时间(使用默认的任务组名,触发器名,触发器组名)    public static void modifyJobTime(String jobname, String time){        try {            Scheduler scheduler = factory.getScheduler();            // 根据trigger的name和触发器组名获取            // 如果创建触发器的时候是使用SimpleTrigger, 那么这里要强转为SimpleTrigger            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(new TriggerKey(jobname,TRIGGER_GROUP_NAME));            System.out.println(trigger);            if (trigger == null){                return;            }            // 获取之前的时间表达式            String oldTime = trigger.getCronExpression();            // 如果前后不一致, 就移除前面的任务, 添加新的            if (!oldTime.equalsIgnoreCase(time)){                // 获取任务信息                JobDetail jobDetail = scheduler.getJobDetail(new JobKey(jobname,JOB_GROUP_NAME));                // 获取任务的class信息                Class jobJobClass = jobDetail.getJobClass();                // 移除之前的任务                removeJob(jobname);                // 添加新任务                addJob(jobname, jobJobClass, time);            }        } catch (SchedulerException e) {            e.printStackTrace();        }    }    // 移除任务    public static void removeJob(String jobname){        try {            Scheduler scheduler = factory.getScheduler();            // 先暂停scheduler            scheduler.pauseTrigger(new TriggerKey(jobname, TRIGGER_GROUP_NAME));            // 然后将任务从scheduler任务序列中移除            scheduler.unscheduleJob(new TriggerKey(jobname, TRIGGER_GROUP_NAME));            // 最后删除任务            scheduler.deleteJob(new JobKey(jobname, JOB_GROUP_NAME));        } catch (SchedulerException e) {            e.printStackTrace();        }    }    // 启动所有定时任务    public static void startJobs(){        try {            Scheduler scheduler = factory.getScheduler();            scheduler.start();        } catch (SchedulerException e) {            e.printStackTrace();        }    }    // 关闭所有定时任务    public static void shutdownJobs(){        try {            Scheduler scheduler = factory.getScheduler();            if (! scheduler.isShutdown()){                scheduler.shutdown();            }        } catch (SchedulerException e) {            e.printStackTrace();        }    }}

MainTest:

public class MainTest {    @Test    public void mainTest(){        try {            String job_name = "动态任务调度";            System.out.println("----任务启动: 开始(10秒一次)----");            QuartzManager.addJob(job_name, MyJob.class, "0/10 * * * * ?");            Thread.sleep(2000);            System.out.println("====修改时间: 开始(2秒一次)====");            QuartzManager.modifyJobTime(job_name, "0/2 * * * * ?");            Thread.sleep(6000);            System.out.println("~~~~移除定时: 开始~~~~");            QuartzManager.removeJob(job_name);            System.out.println("****移除成功****");            System.out.println("----再次添加任务: 开始(10秒一次)----");            QuartzManager.addJob(job_name, MyJob.class, "0/10 * * * * ?");            Thread.sleep(60000);            System.out.println("~~~~移除定时: 开始~~~~");            QuartzManager.removeJob(job_name);            System.out.println("****移除成功****");        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
原创粉丝点击