Java任务调度框架Quartz教程实例

来源:互联网 发布:html5跑酷游戏源码 编辑:程序博客网 时间:2024/05/01 16:08

参考链接:http://blog.csdn.net/yuebinghaoyuan/article/details/9045471

参考链接:http://blog.csdn.net/hu1991die/article/details/44565029


核心概念
 Quartz核心的概念scheduler任务调度、Job任务、Trigger触发器、JobDetail任务细节
 
 Job任务:其实Job是接口,其中只有一个execute方法:
 package org.quartz;
public abstract interface Job
{
  public abstract void execute(JobExecutionContext paramJobExecutionContext)
    throws JobExecutionException;
}
 我们开发者只要实现此接口,实现execute方法即可。把我们想做的事情,在execute中执行即可。
 JobDetail:任务细节,Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。
 Trigger触发器:执行任务的规则;比如每天,每小时等。
 一般情况使用SimpleTrigger,和CronTrigger,这个触发器实现了Trigger接口。
 对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger
 对于简单的时间来说,比如每天执行几次,使用SimpleTrigger
 scheduler任务调度:是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。

具体实例1 :

QuartzUtil

package com.eastcom.first.spark.data.quartz;import org.quartz.Job;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.SimpleScheduleBuilder;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class QuartzUtil {private final static String JOB_GROUP_NAME = "QUARTZ_JOBGROUP_NAME";// 任务组private final static String TRIGGER_GROUP_NAME = "QUARTZ_TRIGGERGROUP_NAME";// 触发器组private static Logger log = LoggerFactory.getLogger(QuartzUtil.class);// 日志/** * 添加任务的方法 *  * @param jobName *            任务名 * @param triggerName *            触发器名 * @param jobClass *            执行任务的类 * @param seconds *            间隔时间 * @throws SchedulerException */public static void addJob(String jobName, String triggerName, Class<? extends Job> jobClass, int seconds)throws SchedulerException {log.info("==================initialization=================");// 创建一个SchedulerFactory工厂实例SchedulerFactory sf = new StdSchedulerFactory();// 通过SchedulerFactory构建Scheduler对象Scheduler sche = sf.getScheduler();log.info("===================initialize finshed===================");log.info("==============add the Job to Scheduler==================");// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();// 构建一个触发器,规定触发的规则Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器.withIdentity(triggerName, TRIGGER_GROUP_NAME)// 给触发器起一个名字和组名.startNow()// 立即执行.withSchedule(SimpleScheduleBuilder.simpleSchedule() // 执行计划.withIntervalInSeconds(seconds) // 执行间隔: 表.repeatForever()// 一直执行).build();// 产生触发器// 向Scheduler中添加job任务和trigger触发器sche.scheduleJob(jobDetail, trigger);// 启动sche.start();}}

TestJobOne

package com.eastcom.first.spark.data.quartz;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public class TestJobOne implements Job {/** * 执行任务的方法 */public void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("================执行任务一....");// do more...这里可以执行其他需要执行的任务}}

TestJobTwo

package com.eastcom.first.spark.data.quartz;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public class TestJobTwo implements Job {/** * 执行任务的方法 */public void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("================执行任务二....");// do more...这里可以执行其他需要执行的任务}}

QuartzClient

package com.eastcom.first.spark.data.quartz;import org.quartz.SchedulerException;public class QuartzClient {/** * 测试 *  * @param args */public static void main(String[] args) {try {// 添加第一个任务 每隔2秒执行一次QuartzUtil.addJob("job1", "trigger1", TestJobOne.class, 2);// 添加第二个任务 每隔5秒执行一次QuartzUtil.addJob("Job2", "trigger2", TestJobTwo.class, 5);} catch (SchedulerException e) {e.printStackTrace();}}}

运行结果

 INFO | Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' INFO | Quartz scheduler version: 2.3.0 INFO | ===================initialize finshed=================== INFO | ==============add the Job to Scheduler================== INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. INFO | ==================initialization================= INFO | ===================initialize finshed=================== INFO | ==============add the Job to Scheduler================== INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.================执行任务二....================执行任务一....================执行任务一....================执行任务一....================执行任务二....================执行任务一....================执行任务一....


如果设置定时任务采用crontab的表达式形式。job类不需要边,只是 QuartzUtil需要修改下

QuartzUtil2

package com.eastcom.first.spark.data.quartz;import org.quartz.CronScheduleBuilder;import org.quartz.Job;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class QuartzUtil2 {private final static String JOB_GROUP_NAME = "QUARTZ_JOBGROUP_NAME";// 任务组private final static String TRIGGER_GROUP_NAME = "QUARTZ_TRIGGERGROUP_NAME";// 触发器组private static Logger log = LoggerFactory.getLogger(QuartzUtil2.class);// 日志/** * 添加任务的方法 *  * @param jobName *            任务名 * @param triggerName *            触发器名 * @param jobClass *            执行任务的类 * @param seconds *            间隔时间 * @throws SchedulerException */public static void addJob(String jobName, String triggerName, Class<? extends Job> jobClass, String cronExpression)throws SchedulerException {log.info("==================initialization=================");// 创建一个SchedulerFactory工厂实例SchedulerFactory sf = new StdSchedulerFactory();// 通过SchedulerFactory构建Scheduler对象Scheduler sche = sf.getScheduler();log.info("===================initialize finshed===================");log.info("==============add the Job to Scheduler==================");// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();// 构建一个触发器,规定触发的规则Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器.withIdentity(triggerName, TRIGGER_GROUP_NAME)// 给触发器起一个名字和组名.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).startNow()// 立即执行.build();// 产生触发器// 向Scheduler中添加job任务和trigger触发器sche.scheduleJob(jobDetail, trigger);// 启动sche.start();}}

QuartzClient2

package com.eastcom.first.spark.data.quartz;import org.quartz.SchedulerException;public class QuartzClient2 {/** * 测试 *  * @param args */public static void main(String[] args) {try {String cronExpression1 = "0-55/5 * * * * ? *";// 添加第一个任务 每隔5秒执行一次QuartzUtil2.addJob("job1", "trigger1", TestJobOne.class, cronExpression1);// 添加第二个任务 每隔10秒执行一次String cronExpression2 = "0-50/10 * * * * ? *";QuartzUtil2.addJob("Job2", "trigger2", TestJobTwo.class, cronExpression2);} catch (SchedulerException e) {e.printStackTrace();}}}

运行结果:

SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/apache/activemq/activemq-all/5.15.0/activemq-all-5.15.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: Found binding in [jar:file:/C:/Users/Administrator/.m2/repository/org/slf4j/slf4j-log4j12/1.7.21/slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] INFO | ==================initialization================= INFO | Using default implementation for ThreadExecutor INFO | Job execution threads will use class loader of thread: main INFO | Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl INFO | Quartz Scheduler v.2.3.0 created. INFO | RAMJobStore initialized. INFO | Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.  NOT STARTED.  Currently in standby mode.  Number of jobs executed: 0  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. INFO | Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' INFO | Quartz scheduler version: 2.3.0 INFO | ===================initialize finshed=================== INFO | ==============add the Job to Scheduler================== INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. INFO | ==================initialization================= INFO | ===================initialize finshed=================== INFO | ==============add the Job to Scheduler================== INFO | Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.================执行任务一....================执行任务一....================执行任务二....


over





原创粉丝点击