Quartz学习(一)--初始Quartz

  一、什么是Quartz

     1、quartz是一个作业调度系统(a job scheduling system),不但可以集成到其他软件系统中,而且还可以独立运行

     2、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。
     3、Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。借助于cron表达式,他可以执行各种复杂的任务调度虽然JDK为简单任务调度提供了Timer支持,但对于更复杂的调度,如:在某个特定的时刻调度任务,Timer就力不从心了
     4、Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。


  二、下载和安装Quartz

    1、Quartz的下载:http://www.quartz-scheduler.org/   (只有注册用户才能下载)

    下载完成,将得到quartz-2.1.6.tar.gz,解压后得到的目录结构是:

    doc :  API  和  各种数据库的建表sql (纳尼?! 还和数据库有关系.)(⊙_⊙?) Quartz应用到集群,和持久化作业的时候会用到,先不讨论,咱入门先!

    examples : 官方给写的例子了,也就是我们本次学习的重点

    lib : Quartz 所依赖的jar , 相信你的工程中已经添加了吧 ,主要是 log c3p0 什么的,自己看看吧

    quartz : 源码

    …………

    quartz-all-2.1.6.jar : 打好的 jar 包,将其放入工程的classpath路径下即可

  三、javaSE中使用Quartz步骤

    1、将quartz-all-2.1.6.jar或者quartz-2.1.6.jar添加到classpath路径下。

      (实际上Quartz还是用SLF4J作为日志工具,因此还需要将slf4j-api-2.1.6.jar导入到类路径下

   2、配置quartz运行环境的基本属性文件:quartz.properties  (放在类路径下即可)

# 配置主调度器属性
org.quartz.scheduler.instanceName=QuartzScheduler
org.quartz.scheduler.instanceId=AUTO
# 配置线程池
# Quartz线程池的实现类
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
# 线程池的线程数量
org.quartz.threadPool.threadCount=1
# 线程池里线程的优先级
org.quartz.threadPool.threadPriority=10
# 配置作业存储
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore

如果我们不配置此文件的话,默认使用quartz-2.1.6.jar中的quartz.properties文件(在该压缩文件的org/quartz路径下),如果需要改变其运行属性,我们可以自己创建一个quartz.properties文件,并将该文件放在系统加载的类路径下,ClassLoader就会自动加载并启用其中的各种属性

  3、创建quartz作业类

    该类须实现org.quartz.Jog接口,该接口只有一个execute()方法,当quartz调度改作业运行时,execute()方法就会执行。

package lee;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.*;
public class TestJob
	implements Job
{
	//判断作业是否执行的旗标
	private boolean isRunning = false;
	public void execute(JobExecutionContext context) 
		throws JobExecutionException
	{
		//如果作业没有被调度
		if (!isRunning)
		{
			System.out.println(new Date() + "  作业被调度。");
			//循环100次来模拟任务的执行
			for (int i = 0; i < 100 ; i++)
			{
				System.out.println("作业完成" + (i + 1) + "%");
				try
				{
					Thread.sleep(100);
				}
				catch (InterruptedException ex)
				{
					ex.printStackTrace();
				}
			}
			System.out.println(new Date() + "  作业调度结束。");
		}
		//如果作业正在运行,即使获得调度,也立即退出
		else
		{
			System.out.println(new Date() + "任务退出");
		}
	}
}
 3、创建quartz触发器

    触发器用来指定任务被调度的时机。该框架提供了一系列的触发器,但最常用的的是:SimpleTrigger和CronTrigger。

   SimpleTrigger:主要用于简单的调度。如在给定的时间内重复执行作业或者间隔固定的时间执行作业。类似于JDK提供的Timer。

   CronTrigger:用于执行更复杂的调度。该调度器基于Calendar—Like和Unix Corn的表达式。

  如:   //创建trigger,创建一个简单的调度器
        //指定该任务被重复调度50次,每次间隔2秒
        Trigger trigger = new SimpleTrigger("dd" ,
        Scheduler.DEFAULT_GROUP, 50, 20000) ;

   4、创建quartz调度器

    调度器用于将任务和触发器管理起来,任务和触发器是多对多的关系:当一个任务关联多个触发器时,每个触发器被激发时,这个任务都会被调度一次;当一个触发器控制多个任务时,此触发器被触发时,所有关联到给触发器的任务都将被调度。

   quartz调度器由Schedule接口体现。该接口声明如下方法:

   a:void addJob(JobDetail d,boolean replace):将jobDetail实例添加到调度器。

   b:Date scheduleJob(JobDetail d,Trigger t):使用Trigger来控制JobDetail实例。

   c:Date scheduleJob(Trigger t):添加触发器t来调度作业。

        

package lee;

import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
public class MyQuartzServer
{
	public static void main(String[] args)
	{
		MyQuartzServer server = new MyQuartzServer();
		try
		{
			server.startScheduler();
		}
		catch (SchedulerException ex)
		{
			ex.printStackTrace();
		}
	}
	//执行调度
	private void startScheduler() throws SchedulerException 
	{
		//使用工厂创建调度器实例
		Scheduler scheduler = StdSchedulerFactory
			.getDefaultScheduler(); 
		//以作业创建JobDetail实例
		JobDetail jobDetail = new JobDetail("dd", 
			Scheduler.DEFAULT_GROUP , TestJob.class);
		//创建trigger,创建一个简单的调度器
		//指定该任务被重复调度50次,每次间隔2秒
		Trigger trigger = new SimpleTrigger("dd" , 
			Scheduler.DEFAULT_GROUP, 50, 20000) ;
		//调度器将作业与trigger关联起来
		scheduler.scheduleJob(jobDetail, trigger ); 
		//开始调度
		scheduler.start();
	}
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值