`

quartz

 
阅读更多
http://blog.csdn.net/bibitoo712/article/details/476253

quartz 是著名的 opensymphony 的一个项目,是一个全能型的调度系统,可以在j2ee中使用,也可以独立运行。

quartz的网站上的文档写的比较清晰明了,入门很容易,不过要使用其全部功能估计还是要费点功夫。

quartz支持插件型功能扩展,使用者可以自己编写适合的插件。

下面是一个入门的例子:

1.要求:定义两个工作,设定这两个工作的运行时间和间隔时间,这两个工作使用数据库作为持久化,运行后会发送email到指定地址。

2.quartz 的配置:

配置quartz只需要配置一个文件:quartz.properties。此文件的原型在 quartz-1.4.5/docs/config 目录下面,将example_quartz.properties拷贝到java源文件目录并改名为quartz.properties。

quartz的配置主要选项:

数据库配置:

 org.quartz.jobStore.class  =  org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass  =  org.quartz.impl.jdbcjobstore.MSSQLDelegate
org.quartz.jobStore.useProperties  =  false
org.quartz.jobStore.dataSource  =  myDS
org.quartz.jobStore.tablePrefix  =  QRTZ_
org.quartz.jobStore.isClustered  =  false

org.quartz.dataSource.myDS.driver  =  com.microsoft.jdbc.sqlserver.SQLServerDriver
org.quartz.dataSource.myDS.URL  =  jdbc:microsoft:sqlserver://hr:1433;SelectMethod=cursor
org.quartz.dataSource.myDS.user  =  hradmin
org.quartz.dataSource.myDS.password  =  admin
org.quartz.dataSource.myDS.maxConnections  =  10



这是mssql数据库的配置,其他数据库请配置适合的org.quartz.jobStore.driverDelegateClass名称。

这里配置的数据源名称为 myDS 。这唯一标志了这个数据连接。将在取得数据库连接的时候使用到。

 org.quartz.plugin.jobInitializer.fileName  =  data/my_job_data.xml

这里指定的初始化文件名称必须具有此文件,否则quartz不能运行。这里建立了一个空文件。

quartz的数据库脚本放在 quartz-1.4.5/docs/dbTables 目录,支持常用的数据库。

3.调度主类:
package com.demo.job;import java.util.Date;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.quartz.Calendar;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SimpleTrigger;import org.quartz.impl.calendar.AnnualCalendar;public class LoadJob {    public static void LoadJob(SchedulerFactory sf) throws Exception {        Log lg = LogFactory.getLog(LoadJob.class);        lg.info("------- 初始化 -------------------");        Scheduler sched = sf.getScheduler();        lg.warn("      *** 正在删除现有的工作和触发器 ***");        String[] groups = sched.getTriggerGroupNames();        for (int i = 0; i < groups.length; i++) {            String[] names = sched.getTriggerNames(groups[i]);            for (int j = 0; j < names.length; j++)                sched.unscheduleJob(names[j], groups[i]);        }        groups = sched.getJobGroupNames();        for (int i = 0; i < groups.length; i++) {            String[] names = sched.getJobNames(groups[i]);            for (int j = 0; j < names.length; j++)                sched.deleteJob(names[j], groups[i]);        }        lg.info("------- 初始化完毕 -----------");        lg.info("------- 安排工作-----------");        String schedId = sched.getSchedulerInstanceId();        int count = 1;                 JobDetail job = new JobDetail("job_" + count, "sampleJob",                    SecondJob.class);             SimpleTrigger trigger = new SimpleTrigger("trig_" + count, "sampleJob");            Calendar cal=null;                                   //如果是一天一次的job                       cal = new AnnualCalendar();                            java.util.Calendar rightNow = java.util.Calendar.getInstance();                    long repeatInterval=24*60*60000;                            //long repeatInterval=10000;                 trigger = new SimpleTrigger("Trigger",                                          Scheduler.DEFAULT_GROUP, rightNow.getTime(), null,                                          SimpleTrigger.REPEAT_INDEFINITELY, repeatInterval);                 // Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar                      trigger.setCalendarName("sampleJob");                      sched.addCalendar("sampleJob", cal, true, true);            sched.scheduleJob(job, trigger);            lg.info("...调度工作1..");                        count++;                        job = new JobDetail("job_" + count, "secondjob",                    SampleJob.class);             trigger = new SimpleTrigger("trig_" + count, "secondjob");                                        //如果是一天一次的job                       cal = new AnnualCalendar();                                 //rightNow = java.util.Calendar.getInstance();                    Date startTime = new Date(System.currentTimeMillis() + 10000L                        + (count * 100));                 trigger = new SimpleTrigger("TriggerContract",                                          Scheduler.DEFAULT_GROUP, startTime, null,                                          SimpleTrigger.REPEAT_INDEFINITELY, repeatInterval);                 // Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar                      trigger.setCalendarName("contractjob");                      sched.addCalendar("contractjob", cal, true, true);            sched.scheduleJob(job, trigger);            lg.info("...调度工作2..");               lg.info("完成安排所有"+count+"个工作.");        lg.info("------- 开始调度 ----------------");        // jobs dont start firing until start() has been called...        sched.start();        lg.info("------- 调度已经开始完毕 -----------------");        lg.info("------- 调度运行中... -----------------------");        try{            Thread.sleep(80000L);        }catch(Exception e){            e.printStackTrace();        }        sched.shutdown();    }    /**     * @param args     */    public static void main(String[] args) {        try {            boolean clearJobs = false;            boolean scheduleJobs = true;            for (int i = 0; i < args.length; i++) {                if (args[i].equals("clearJobs")) clearJobs = true;                if (args[i].equals("dontScheduleJobs")) scheduleJobs = false;            }            LoadJob(new org.quartz.impl.StdSchedulerFactory());        } catch (Exception e) {            e.printStackTrace();        }    }}

主类中有俩个工作加入调度队列:SampleJob 和SecondJob
SampleJob:
package com.demo.job;

import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Calendar;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.calendar.AnnualCalendar;

public class LoadJob {
	public static void LoadJob(SchedulerFactory sf) throws Exception {
		Log lg = LogFactory.getLog(LoadJob.class);
		lg.info("------- 初始化 -------------------");
		Scheduler sched = sf.getScheduler();
		lg.warn("      *** 正在删除现有的工作和触发器 ***");
		String[] groups = sched.getTriggerGroupNames();
		for (int i = 0; i < groups.length; i++) {
			String[] names = sched.getTriggerNames(groups[i]);
			for (int j = 0; j < names.length; j++)
				sched.unscheduleJob(names[j], groups[i]);
		}
		groups = sched.getJobGroupNames();
		for (int i = 0; i < groups.length; i++) {
			String[] names = sched.getJobNames(groups[i]);
			for (int j = 0; j < names.length; j++)
				sched.deleteJob(names[j], groups[i]);
		}
		lg.info("------- 初始化完毕 -----------");
		lg.info("------- 安排工作-----------");
		String schedId = sched.getSchedulerInstanceId();
		int count = 1;
		JobDetail job = new JobDetail("job_" + count, "sampleJob",
				SecondJob.class);
		SimpleTrigger trigger = new SimpleTrigger("trig_" + count, "sampleJob");
		Calendar cal = null; // 如果是一天一次的job
		cal = new AnnualCalendar();
		java.util.Calendar rightNow = java.util.Calendar.getInstance();
		long repeatInterval = 24 * 60 * 60000;
		// long repeatInterval=10000;
		trigger = new SimpleTrigger("Trigger", Scheduler.DEFAULT_GROUP,
				rightNow.getTime(), null, SimpleTrigger.REPEAT_INDEFINITELY,
				repeatInterval);
		// Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar
		trigger.setCalendarName("sampleJob");
		sched.addCalendar("sampleJob", cal, true, true);
		sched.scheduleJob(job, trigger);
		lg.info("...调度工作1..");
		count++;
		job = new JobDetail("job_" + count, "secondjob", SampleJob.class);
		trigger = new SimpleTrigger("trig_" + count, "secondjob");
		// 如果是一天一次的job
		cal = new AnnualCalendar();
		// rightNow = java.util.Calendar.getInstance();
		Date startTime = new Date(System.currentTimeMillis() + 10000L
				+ (count * 100));
		trigger = new SimpleTrigger("TriggerContract", Scheduler.DEFAULT_GROUP,
				startTime, null, SimpleTrigger.REPEAT_INDEFINITELY,
				repeatInterval);
		// Trigger 关联一个Calendar, batchinfo.getName()唯一表示一个Calendar
		trigger.setCalendarName("contractjob");
		sched.addCalendar("contractjob", cal, true, true);
		sched.scheduleJob(job, trigger);
		lg.info("...调度工作2..");
		lg.info("完成安排所有" + count + "个工作.");
		lg.info("------- 开始调度 ----------------");
		// jobs dont start firing until start() has been called...
		sched.start();
		lg.info("------- 调度已经开始完毕 -----------------");
		lg.info("------- 调度运行中... -----------------------");
		try {
			Thread.sleep(80000L);
		} catch (Exception e) {
			e.printStackTrace();
		}
		sched.shutdown();
	}

	/** * @param args */
	public static void main(String[] args) {
		try {
			boolean clearJobs = false;
			boolean scheduleJobs = true;
			for (int i = 0; i < args.length; i++) {
				if (args[i].equals("clearJobs"))
					clearJobs = true;
				if (args[i].equals("dontScheduleJobs")) {
					scheduleJobs = false;
					LoadJob(new org.quartz.impl.StdSchedulerFactory());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

SecondJob:
 

package com.demo.job;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Date;import java.util.GregorianCalendar;import java.util.ResourceBundle;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobPersistenceException;import org.quartz.impl.jdbcjobstore.JobStoreSupport;import org.quartz.jobs.ee.mail.SendMailJob;import org.quartz.utils.DBConnectionManager;public class SecondJob  implements Job {    public SecondJob() {        super();        // TODO Auto-generated constructor stub    }    public void execute(JobExecutionContext context) throws JobExecutionException {        System.err.println("--->" + context.getJobDetail().getFullName()                + " executing.[" + new Date() + "]");        JobDataMap data = context.getJobDetail().getJobDataMap();        ResourceBundle bundle = ResourceBundle.getBundle("quartz");        String smtp = bundle.getString("org.qurtz.job.mail.smtp.host");        String recipient = bundle.getString("org.qurtz.job.mail.smtp.recipient");        String sender = bundle.getString("org.qurtz.job.mail.smtp.sender");        data.put(SendMailJob.PROP_SMTP_HOST,smtp);       // data.put(SendMailJob.PROP_RECIPIENT,recipient);        data.put(SendMailJob.PROP_SENDER,sender);                int predate = 14;        try {            try {                               System.out.println("取得连接对象");                Connection con = getConnection();                //在此进行数据库操作                //....                con.close();            } catch (ClassCastException ignoree) {            }                    } catch (Exception ignore) {            ignore.printStackTrace();        }        System.err.println("--- " + context.getJobDetail().getFullName()                + " complete.[" + new Date() + "]");    }    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub    }    protected Connection getConnection() throws JobPersistenceException {        try {            Connection conn = DBConnectionManager.getInstance().getConnection(                    "myDS");            if (conn == null) { throw new SQLException(                    "Could not get connection from DataSource "                    + "myDS" + ""); }            return conn;        } catch (SQLException sqle) {            throw new JobPersistenceException(                    "Failed to obtain DB connection from data source "                    + "myDS" + ": " + sqle.toString(), sqle);        } catch (Exception e) {            throw new JobPersistenceException(                    "Failed to obtain DB connection from data source "                    + "myDS" + ": " + e.toString(), e,                    JobPersistenceException.ERR_PERSISTENCE_CRITICAL_FAILURE);        }    }}




<bean name="statJob" class="com.alibaba.work.statistic.service.impl.StatisticServiceImpl" />

    <bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <property name="targetObject">
           <ref bean="statJob" />
       </property>
       <property name="targetMethod">
           <value>statDailySender</value>
       </property>
    </bean>
    <!-- 配置触发器 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
       <property name="jobDetail">
           <ref bean="methodInvokingJobDetail" />
       </property>
       <property name="cronExpression" value="0 * * * * ?"/>
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
       <property name="triggers">
           <list>
              <ref local="cronTrigger" />
           </list>
       </property>
    </bean>
分享到:
评论

相关推荐

    quartz-2.3.2-API文档-中文版.zip

    赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...

    quartz-2.3.0-API文档-中文版.zip

    赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...

    quartz指南,Quartz 工程

    文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...

    自开发实现Quartz Web管理工具

    网上能找到的Quartz Web管理的资料都是使用的一个国外人写的Quartz WebApp的东东,功能也很全面。但是作为自己的应用其实用不了那么多功能,一般我们只要可以定义一个job,指定一个Cron表达式完成工作即可,附带的...

    Quartz.NET-2.0

    Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...

    quartz-1.6.0.jar和quartz-all-1.6.0.jar

    该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar

    quartz-2.2.3版本的quartz初始化sql语句

    quartz-2.2.3版本的quartz初始化sql语句

    quartz-2.1.1 完整源码

    Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵 活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度 What's New In Quartz Scheduler ...

    Quartz原理及实例

    Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例

    Quartz-2.0.2 CSDN下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...

    quartz-2.3.0-API文档-中英对照版.zip

    赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...

    quartz-1.6.1-API文档-中文版.zip

    赠送jar包:quartz-1.6.1.jar; 赠送原API文档:quartz-1.6.1-javadoc.jar; 包含翻译后的API文档:quartz-1.6.1-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:org.opensymphony.quartz,...

    quartz官方数据库大全

    Quartz是一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业; 将任务定义为标准...

    Quartz-1.8.6 CSDN 下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...

    Quartz-2.2.3 CSDN 下载

    Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...

    Quartz.NET 调度系统 demo

    前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API...

    深入解读Quartz的原理

    深入解读Quartz的原理,定时任务框架是web开发过程中使用很多的框架之一

    quartz-1.4.5.zip

    Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce ...

    C# 控制台Quartz定时任务.doc

    Quartz定时任务

    quartz-2.2.1 最新包

    quartz-2.2.1 最新包

Global site tag (gtag.js) - Google Analytics