您的位置:首页 > 编程语言 > Java开发

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

2017-07-25 14:51 561 查看
参考链接: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐