Quartz学习一_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Quartz学习一

Quartz学习一

 2013/10/16 21:36:33  deng816  程序员俱乐部  我要评论(0)
  • 摘要:最近项目里面有用到Quartz框架来开发一些定时任务等,之前是没有接触过它,因此在认真研究后,把我自己的一些学习心得与所写的例子记录在这里。前几天又再次回顾了以前了解过的一些设计模式,并决心以博客的形式记录与此,主要有两个目的,第一:如果哪天我对这些知识点忘记了,我可以随时拿起手机进行回顾;第二:如果这些知识点能够帮助别人学习那就是再好不过的事了。才记录不到几篇的内容就收到了一些网友的评论,其中有鼓励的声音,也有批评的声音,同时也有怀疑的声音。对于这些我都会欣然去接受
  • 标签:学习 Quartz

? ? ? ? ? ? ? 最近项目里面有用到Quartz框架来开发一些定时任务等,之前是没有接触过它,因此在认真研究后,把我自己的一些学习心得与所写的例子记录在这里。

? ? ? ? ? ? ? 前几天又再次回顾了以前了解过的一些设计模式,并决心以博客的形式记录与此,主要有两个目的,第一:如果哪天我对这些知识点忘记了,我可以随时拿起手机进行回顾;第二:如果这些知识点能够帮助别人学习那就是再好不过的事了。才记录不到几篇的内容就收到了一些网友的评论,其中有鼓励的声音,也有批评的声音,同时也有怀疑的声音。对于这些我都会欣然去接受,我觉得它们都是对自己的鼓励。同时我想说:“在知识的大森林中我永远想做一只不断追求的菜鸟”。欢迎各位的指正,这将是我莫大的动力。

?

第一篇 ?不基于配置的Quartz

? ? ?首先你需要去下载Quartz,并在MyEclipse中创建一个Java工程,并加入一些jar包,如:我这里加入的包,commons-beanutils.jar,commons-codec.jar,commons-collections-3.1.jar,commons-dbcp-1.2.1.jar,

commons-digester-1.8.jar,commons-logging-1.1.jar,commons-pool.jar,quartz-1.6.0.jar。

? ? 每一个quartz job的实现类,都在实现Quartz的job接口,并实现这个接口中的唯一方法:execute。如下代码:

class="java" name="code">package com.dsl.myjob;

import java.text.SimpleDateFormat;
import java.util.Date;

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

public class TestJob implements Job {

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.out.println("enter execute function..."+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		JobDetail jd=context.getJobDetail();
		JobDataMap jdm=jd.getJobDataMap();
		String hi=jdm.getString("HI");
		if(hi!=null){
			System.out.println(hi);
		}
		String name=jdm.getString("NAME");
		if(name!=null){
			System.out.println(name);
		}
	}

}

?当 Quartz 调度器确定到时间要激发一个 Job 的时候,它就会生成一个 Job 实例,并调用这个实例的 execute() 方法。调度器只管调用 execute() 方法,而不关心执行的结果.

SimpleScheduler类:

package com.dsl.myjob;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleScheduler {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SimpleScheduler simple=new SimpleScheduler();
		//创建调度器并调度job
		try {
			Scheduler sch=simple.createScheduler();
			simple.schedulJob(sch);
			sch.start();//这一步很重要,如果不调start 那么调度器不会启用
			
			//sch.shutdown();//只用调这个方法时,调度器才会关闭
		} catch (SchedulerException e) {
			System.out.println(e);
		}
	}

	
	private void schedulJob(Scheduler sch) throws SchedulerException {
		//为job create 一个JobDetail
		JobDetail jobDetail=new JobDetail("ScanDirectory",Scheduler.DEFAULT_GROUP,TestJob.class);
		//创建一个每10秒运和的触发器
		Trigger trigger=TriggerUtils.makeSecondlyTrigger(10);
		trigger.setName("scanTrigger");//设置trigger的名称
		//设置第一次出发时间 
		trigger.setStartTime(new Date());
		//关联trigger和job
		sch.scheduleJob(jobDetail,trigger);
		//---
	}

	//create 调度器
	private Scheduler createScheduler() throws SchedulerException {
		
		return StdSchedulerFactory.getDefaultScheduler();
	}

}

?

?可是这样写却有很多不方便之处:

1、因为每一个 Job 都必须用 Scheduler 来注册,所以先定义一个 JobDetail,并关联到这个 Scheduler的 实例。如果我想重用一个Job类,并让它产生多个实例,那们你就要为它创建多个JobDetail 并在Scheduler注册,这样就不爽了。

2、如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译,这样也不方便。

? ? ? ? 所以Quartz它提供了方便的基于配置的实现。学习二中将提到。?

发表评论
用户名: 匿名