`

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 quartz-1.8.6 dbTables 建表sql

    Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它提供了丰富的API和灵活性,使得开发者可以方便地定义、安排和管理各种任务。版本1.8.6是Quartz的一个稳定版本,它包含了对数据库...

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

    Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息...

    quartz创建表sql

    Quartz 是一个开源的作业调度框架,广泛应用于Java企业级应用中,用于自动化任务执行,如定时触发工作流、发送邮件、数据同步等。在Quartz的部署和配置过程中,为了存储作业和触发器的信息,我们需要在关系型数据库...

    深入解读Quartz的原理

    ### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。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...

    Android studio下的quartz工程

    **Android Studio下的Quartz工程详解** Quartz是一个开源的作业调度框架,广泛应用于Java环境中的任务调度。在Android Studio中使用Quartz,可以为应用程序添加定时执行的任务功能,例如定期发送通知、更新数据或者...

    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 SQL脚本

    Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它允许开发者灵活地定义作业和触发器,实现复杂的时间调度。在2.3.0这个版本中,Quartz 提供了针对不同数据库系统的初始化脚本,...

    quartz scheduler 入门教程

    quartz scheduler 入门教程 Quartz Scheduler 是一种功能丰富、开源的任务调度程序库,可以在任何 Java 程序中使用。它可以用来创建简单或者复杂的执行次数可以达成千上万的任务。任务可以是任何 Java 可以做的事情...

    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.net-定时任务 Demo

    Quartz.NET是一款强大的开源作业调度框架,用于在.NET环境中创建和执行定时任务。这个"Quartz.net-定时任务 Demo"示例将展示如何利用Quartz.NET来安排代码在指定时间后执行,比如几十分钟后的场景。 Quartz.NET的...

    quartz 持久化数据库表结构sql

    Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它支持持久化任务和触发器到数据库,确保即使在系统重启后也能恢复先前的任务安排。本篇将详细介绍Quartz如何实现数据库持久化,并...

    Quartz 2.2.2数据库表格脚本

    Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。Quartz 2.2.2 版本是其在特定时间的一个稳定版本,它提供了丰富的功能来帮助开发者创建、安排和管理任务。在描述中提到的"数据库...

    quartz动态任务管理

    Quartz是一款开源的作业调度框架,它允许开发者创建、调度和执行各种类型的任务。这个"quartz动态任务管理"源码包很可能是针对Quartz框架的实现,旨在帮助开发者更方便地管理和控制任务的生命周期。 Quartz的核心...

    quartz官方数据库大全

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

    Quartz.NET 调度系统 demo

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

    Quartz.NET 官方源码及演示例子

    Quartz.NET 是一个开源的作业调度框架,它允许开发者在.NET环境中定义和执行定时任务。这个框架的强大之处在于它的灵活性和可扩展性,使得开发者能够创建复杂的调度逻辑,以满足各种自动化需求。以下是对Quartz.NET...

    Quartz所需jar包

    Quartz是一款开源的作业调度框架,它允许开发者在Java应用程序中定义和执行复杂的定时任务。在Java应用开发中,Quartz常被用来自动化各种后台任务,如数据清理、报告生成等。"Quartz所需jar包"是使用Quartz库进行...

    SpringQuartz的使用文档

    SpringQuartz是一个强大的任务调度框架,它在Java应用程序中用于自动化执行特定任务,如定时生成文件、统计数据或执行后台清理工作。Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时...

    关于spring中quartz的配置

    在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...

Global site tag (gtag.js) - Google Analytics