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

参考链接: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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值