Quartz 使用(2.x版本)

原创 2013年12月03日 17:09:15


Quartz 几个关键词简介:


Scheduler:调度交互的主要API,负责作业/任务调度。



Job :由scheduler负责调度的作业/任务 ,如果你想实现一个作业,需要实现此接口的execute方法。


JobDetail:用于定义Job的实例。


Trigger: 作业执行的触发器,用于定义作业调度如何触发。比如每一小时定时触发一次。


SchedulerListener:  调度器的监听器。

Triggerlistener:  触发器的监听器。

JobListener:   job的监听器。


ListenerManager:监听器管理类,用于添加,移除,设置监听器等。


比如scheduler.getListenerManager.addJobListener(JobListener joblistener,Matcher<JobKey> matcher);


Matcher:用于匹配监听器。

SchedulerFactory :scheduler构造器接口。有三个重要函数getScheduler(),getScheduler(String schedName),getAllSchedulers(),

                             已经实现了此构造器接口有:StdSchedulerFactory 和DirectSchedulerFactory , 此两个实现类,可由于产生scheduler调度器实例。


JobBuilder: Job生成的工具类,用于定义、构造JobDetail的实例。


TriggerBuilder“:Trrigger构造的工具类,用于定义、构造Trigger的实例。


DateBuilder: 日期工具类,可结合TriggerBuilder使用。


JobKey :  Job的识别键,封装jobName和jobGruopName

TriggerKey :  类似JobKey,Trigger的识别键,封装triggerName和triggerGruopName ,

                    比如使用getTrigger(TriggerKey key)取代1.x中的getTrigger(String name,String group).很多其他方法也是类似,JobKey也是如此。


英文描述如下:

The key interfaces of the Quartz API are:

  • Scheduler - the main API for interacting with the scheduler.
  • Job - an interface to be implemented by components that you wish to have executed by the scheduler.
  • JobDetail - used to define instances of Jobs.
  • Trigger - a component that defines the schedule upon which a given Job will be executed.
  • JobBuilder - used to define/build JobDetail instances, which define instances of Jobs.
  • TriggerBuilder - used to define/build Trigger instances.



一个例子:


定义个Job:


/**
 *
 *  Copyright (c) 2013, Seven. All rights reserved.
 *
 */
package com.seven.quartz.job;


import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


/**
 * The class designed for ...
 * 
 *
 * @author  seven
 * @version 1.0
 * @date    2013-12-2  
 */
public class HelloJob implements Job{


	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("say hello ,i am a hello job!");
	}


}





测试类:


/**
 *
 *  Copyright (c) 2013, Seven. All rights reserved.
 *
 */
package com.seven.quartz.schedule;

import java.util.Properties;

import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.JobListener;
import org.quartz.Matcher;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.TriggerListener;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;

import com.seven.quartz.job.HelloJob;
import com.seven.quartz.listener.MyJobListener;

/**
 * The class designed for ...
 * 
 * 
 * @author seven
 * @version 1.0
 * @date 2013-12-3
 */
public class ScheduleTest {
	private static final Logger logger = Logger.getLogger(ScheduleTest.class);
	private Scheduler scheduler = null;

	public Scheduler init() {
		if (scheduler == null) {
			try {
				scheduler = StdSchedulerFactory.getDefaultScheduler();
				// 此处修改修改可以设置监听器,以下几个方法没有指定matcher,那么都是全局的,针对所有的
				// scheduler.getListenerManager().addJobListener(new
				// MonitorJobListener());
				// scheduler.getListenerManager().addSchedulerListener(new
				// MonitorSchedulerListener());
				// scheduler.getListenerManager().addTriggerListener(new
				// MonitorTriggerListener());
			} catch (SchedulerException e) {
				logger.error(
						"failder to builder scheduler , the error message is:",
						e);
			}
		}

		return scheduler;
	}

	/**
	 * 此方法可以设置quartz属性,比如misfire,threadCount等属性
	 * 
	 * @return
	 */
	public Scheduler getScheduler(Properties props) {

		if (scheduler == null) {
			try {
			   /* props = new Properties();
				props.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,
						"org.quartz.simpl.SimpleThreadPool");
				// quartz的线程数,同时运行的线程数
				props.put("org.quartz.threadPool.threadCount", "8");
				// trigger过期1小时内还有效
				props.put("org.quartz.jobStore.misfireThreshold", "60*60*1000");
				*/
				StdSchedulerFactory factory = new StdSchedulerFactory();
				factory.initialize(props);
				scheduler = factory.getScheduler();
			} catch (SchedulerException e) {
				logger.error("can't get a scheduler !", e);
			}
		}

		return scheduler;
	}
	
	public void addJobListener(JobKey jobKey,JobListener jobListener)throws SchedulerException{
		Matcher<JobKey> matcher =  KeyMatcher.keyEquals(jobKey);

		try {
			this.scheduler.getListenerManager().addJobListener(jobListener, matcher);
		} catch (SchedulerException e) {
			try {
				logger.error("add listener ["+jobListener.getName()+"] to "+scheduler.getSchedulerName()+"scheduler error", e);
			} catch (SchedulerException e1) {
				logger.error("get scheduler name error ", e1);
			}
			throw e;
		}
	}
	
	public void addTriggerListener(TriggerKey triggerkey,TriggerListener triggerListener)throws SchedulerException{
		Matcher<TriggerKey> matcher =  KeyMatcher.keyEquals(triggerkey);

		try {
			this.scheduler.getListenerManager().addTriggerListener(triggerListener, matcher);
		} catch (SchedulerException e) {
			try {
				logger.error("add listener ["+triggerListener.getName()+"] to "+scheduler.getSchedulerName()+"scheduler error", e);
			} catch (SchedulerException e1) {
				logger.error("get scheduler name error ", e1);
			}
			throw e;
		}
	}

	public void scheduleJob(String jobName, String triggerName,
			String cronExpression, Class<? extends Job> jobClass) {
		JobDetail jobDetail = null;
		CronTrigger trigger = null;
		JobKey jobKey = new JobKey(jobName, "myJobGroup");
		TriggerKey triggerKey = new TriggerKey(triggerName, "myTriggerGroup");

		jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).build();

		trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
				.forJob(jobDetail)
				.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
				.build();
		try {
			 this.scheduler.scheduleJob(jobDetail, trigger);
		} catch (SchedulerException e) {
			logger.error("can't scheduleJob !", e);
		}

	}

	public void scheduleJob(JobKey jobKey, TriggerKey triggerKey,
			String cronExpression, Class<? extends Job> jobClass) {
		JobDetail jobDetail = null;
		CronTrigger trigger = null;
		jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).build();
		trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
				.forJob(jobDetail)
				.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
				.build();
		try {
			 this.scheduler.scheduleJob(jobDetail, trigger);
		} catch (SchedulerException e) {
			logger.error("can't scheduleJob !", e);
		}

	}

	/**
	 * 设置立刻生成
	 * 
	 * @param jobKey
	 * @param jobClass
	 */
	public void triggerJobNow(JobKey jobKey, Class<? extends Job> jobClass) {
		JobDetail jobDetail = null;
		jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey)
				.storeDurably(true).build();
		try {
			this.scheduler.addJob(jobDetail, true);
		} catch (SchedulerException e) {
			logger.error("can't add Job !", e);
		}
		try {
			this.scheduler.triggerJob(jobKey);
		} catch (SchedulerException e) {
			logger.error("can't trigger Job !", e);
		}

	}

	public void start() {
		try {
			this.scheduler.start();
		} catch (SchedulerException e) {
			logger.error("can't scheduleJob !", e);
		}
	}

	public static void main(String[] args) {
		ScheduleTest test = new ScheduleTest();
		JobKey jobKey = new JobKey("myJob", "myJobGroup");
		test.init();
		try {
			test.addJobListener(jobKey, new MyJobListener());
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		test.triggerJobNow(jobKey, HelloJob.class);
		test.start();

		// TriggerKey triggerKey = new TriggerKey("myTrigger",
		// "myTriggerGroup");
		// //每隔10S执行一次
		// String cronExpression = "0/10 * * * * ?";
		// test.init();
		// test.scheduleJob(jobKey, triggerKey, cronExpression, HelloJob.class);
		// test.start();
	}

}





JobBuilder、TriggerBuilder 这两个工具类设计的很不错。使用了build方式,Effective Java中也有提到。


JobBuilder 中的newJob(Class <? extends Job> jobclass)方法泛型用的很好。值得学习。


在线生成Cron表达式的一个工具:http://www.cronmaker.com/



相关文章推荐

quartz的简单使用-基于2.X(二)【与框架的整合】

与JFinal的集成 JFinal有个插件可以使用以集成。 在 public void configPlugin(Plugins me)中加载插件 QuartzPlugin quartzPlugin ...

quartz 2.x学习使用

Quartz APIQuartz API核心接口有: Scheduler – 与scheduler交互的主要API,是运行job的容器; Job – 你通过scheduler执行任务,你的任务类需...
  • shjhhc
  • shjhhc
  • 2016年01月22日 15:41
  • 184

quartz的简单使用-基于2.X(一)【基本使用】

我自己测试过的代码 SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); ...

java 调用Quartz 不同版本使用分析 1.6x 、1.7x、1.8x

quartz调用框架1.6x、1.7x、1.8x 使用时,所需配置却不同,今天拿出来分别比比分析一下。副标题【论版本管理的重要性】今天整理项目发现项目在本地运行不执行相应job,经过各种查发现quar...

Web项目中使用Spring 3.x + Quartz 2.x实现作业调度详解

Quartz是一个基于Java的作业调度管理的轻量级框架,目前在很多企业应用中被使用,它的作用类似于java.util中的Timer和TimeTask、数据库中的job等,但Quartz的功能更强大、...

避免在Spark 2.x版本中使用sparkSQL,关于CTAS bug的发现过程

避免在Spark 2.x版本中使用sparkSQL,关于CTAS bug的发现过程标签(空格分隔): Spark2.x sparkSQL CTAS避免在Spark 2x版本中使用sparkSQL关于C...
  • bon_mot
  • bon_mot
  • 2017年07月17日 17:03
  • 469

cocos2d-x 2.0.1版本的使用 vs2008 android 上运行 初学篇(1)

cocos2d-x 更新的版本2.0.1 改进了bug和使用了不同的目录结构,这点可以看官方文档。 这里主要是介绍如何、使用cocos2d-x 2.0.1 运行在vs2008 或是andro...

Cocos2d-x中libcurl库的使用(1)查看库的版本信息

使用如下代码,可检测Cocos2d-x中使用的libcurl库的版本信息 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) #include "../cocos...

Android 2.x版本使用ActionBar-强制显示OverflowButton

本博客通过在android2.x中使用ActionBar出现很多问题,比如overflow按钮出不来,菜单显示文字不显示图标等等,通过具体例子一步一步进行介绍,最后从android源码角度进行分析,以...

使用share SDK实现第三方授权登录、分享综合(2.x版本)

StartActivity: [java] view plaincopy package com.home.testshare;      import...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quartz 使用(2.x版本)
举报原因:
原因补充:

(最多只允许输入30个字)