quartz入门例子

注意:任务类一定是public clss且实现Job,即不能使用非public class作为执行任务类如下的 public class QuartzReport就是public class

quartz:1.8.6.jar

1.配置quartz.properties位于classpath下

# Configure Main Scheduler Properties 
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one
# Configure ThreadPool 
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount =  5
org.quartz.threadPool.threadPriority = 4
# Configure JobStore 
org.quartz.jobStore.misfireThreshold = 5000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

2.编写运行代码

package org.senssic.quartz;

import java.util.Date;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;

public class QuartzReport implements Job {

	public void execute(JobExecutionContext cntxt) throws JobExecutionException {
		System.out.println(" Generating report -  "
				+ cntxt.getJobDetail().getJobDataMap().get(" type ")
				+ new Date());
	}

	public static void main(String[] args) {
		try {
			SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
			Scheduler sched = schedFact.getScheduler();
			sched.start();
			JobDetail jobDetail = new JobDetail(" Income Report ",
					" Report Generation ", QuartzReport.class);
			jobDetail.getJobDataMap().put(" type ", " FULL ");
			CronTrigger trigger = new CronTrigger(" Income Report ",
					" Report Generation ");
			/* 每1分钟执行一次 */
			trigger.setCronExpression(" 0 0/1 * * * ? ");
			sched.scheduleJob(jobDetail, trigger);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

3.使用2.2版本

quartz:2.2.0.jar

必须配置log4j,此处使用xml的配置在classpath下建立:log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="default" class="org.apache.log4j.ConsoleAppender">
    <param name="target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
    </layout>
  </appender>


 <logger name="org.quartz">
   <level value="info" />
 </logger>

  <root>
    <level value="info" />
    <appender-ref ref="default" />
  </root>

  
</log4j:configuration>

定时器有多种此处使用CronTrigger,其他几种同样实现Trigger,直接查看即可

执行任务

package org.quartz.examples.example3;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleJob implements Job {
	private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);

	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		JobKey jobKey = context.getJobDetail().getKey();
		_log.info("任务: " + jobKey + "时间" + new Date());
	}
}

调度执行

package org.quartz.examples.example3;


import java.util.Date;


import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerMetaData;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class CronTriggerExample {
	public void run() throws Exception {
		Logger log = LoggerFactory.getLogger(CronTriggerExample.class);


		log.info("------- 初始化 -------------------");
		Scheduler sched = new StdSchedulerFactory().getScheduler();
		log.info("------- 调度任务 ----------------");


		JobDetail job = JobBuilder.newJob(SimpleJob.class)
				.withIdentity("任务1", "组1").build();
		CronTrigger trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器1", "组1")
				.withSchedule(
						CronScheduleBuilder.cronSchedule("0/20 * * * * ?"))
				.build();


		Date ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		job = JobBuilder.newJob(SimpleJob.class).withIdentity("任务2", "组1")
				.build();


		trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器2", "组1")
				.withSchedule(
						CronScheduleBuilder.cronSchedule("15 0/2 * * * ?"))
				.build();


		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		job = JobBuilder.newJob(SimpleJob.class).withIdentity("任务3", "组1")
				.build();


		trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器3", "组1")
				.withSchedule(
						CronScheduleBuilder.cronSchedule("0 0/2 8-17 * * ?"))
				.build();
		// 启动定时器和任务1
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		job = JobBuilder.newJob(SimpleJob.class).withIdentity("任务4", "组1")
				.build();


		trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器4", "组1")
				.withSchedule(
						CronScheduleBuilder.cronSchedule("0 0/3 17-23 * * ?"))
				.build();


		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		job = JobBuilder.newJob(SimpleJob.class).withIdentity("任务5", "组1")
				.build();


		trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器5", "组1")
				.withSchedule(
						CronScheduleBuilder.cronSchedule("0 0 10am 1,15 * ?"))
				.build();


		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		job = JobBuilder.newJob(SimpleJob.class).withIdentity("任务6", "组1")
				.build();


		trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器6", "组1")
				.withSchedule(
						CronScheduleBuilder
								.cronSchedule("0,30 * * ? * MON-FRI")).build();


		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		job = JobBuilder.newJob(SimpleJob.class).withIdentity("任务7", "组1")
				.build();


		trigger = (CronTrigger) TriggerBuilder
				.newTrigger()
				.withIdentity("定时器7", "组1")
				.withSchedule(
						CronScheduleBuilder
								.cronSchedule("0,30 * * ? * SAT,SUN")).build();


		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + "调度任务已经启动,时间: " + ft + " 启动的cron表达式为: "
				+ trigger.getCronExpression());


		log.info("------- 启动整个调度 ----------------");


		sched.start();


		log.info("------- 执行5分钟... ------------");
		try {
			Thread.sleep(300000L);
		} catch (Exception e) {
		}


		log.info("------- 停止 ---------------------");


		sched.shutdown(true);


		SchedulerMetaData metaData = sched.getMetaData();
		log.info("执行 " + metaData.getNumberOfJobsExecuted() + " 任务.");
	}


	public static void main(String[] args) throws Exception {
		CronTriggerExample example = new CronTriggerExample();
		example.run();
	}
}

4.关于quartz.properties配置文件说明

#============================================================================
# Configure Main Scheduler Properties
#============================================================================
在集群中每个实例都必须有一个唯一的instanceId,但是应该有一个相同的instanceName
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO
#org.quartz.scheduler.skipUpdateCheck = true
#============================================================================
# Configure ThreadPool
#============================================================================
定义线程池,SimpleThreadPool这个线程池只是简单地在它的池中保持固定数量的线程,不增长也不缩小。但是它非常健壮且经过良好的测试,差不多每个Quartz用户都使用这个池。
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3   最多只能有3个线程并发
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore  配置数据存储的方式#============================================================================
一个触发器被认定为“misfired”之前,调度器所能容忍的毫秒数
org.quartz.jobStore.misfireThreshold = 60000
1.所有的Quartz数据,例如Job和Trigger的细节信息被存储在内存(数据库)中。
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#org.quartz.jobStore.class = org.quartz.simpl.JDBCJobStore
2.配置事务。JobStoreTX来让Quartz帮你管理事务(这是最普遍的选择)。
如果想让Quartz同其他的事务协同工作(例如:J2EE应用服务器中的事务),那么你需要使用JobStoreCMT,这样,Quartz就会让应用服务器容器来管理事务
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
3.DriverDelegate负责做指定数据库的所有JDBC工作.
如果数据库没有其他指定的代理,那么就试用代理StdJDBCDelegate。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
为了指示JDBCJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中,应设置值为”true”(这是缺省的方式)。
org.quartz.jobStore.useProperties = true
配置数据源源的名数、据库表前前缀
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.tablePrefix = QRTZ_
是否集群  负载均衡和容错
#org.quartz.jobStore.isClustered = false
#============================================================================
# Configure Datasources  配置数据源
#============================================================================
#org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password =
如果Scheduler非常忙(比如,执行的任务数量差不多和线程池的数量相同,那么你需要正确地配置DataSource的连接数量为线程池数量+1)
#org.quartz.dataSource.myDS.maxConnections = 5
#============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 120
org.quartz.plugin.jobInitializer.wrapInUserTransaction =false
 

5.关于Quartz Cron 表达式(时间格式的写法)

http://download.csdn.net/detail/senssic/7189889-->可视化生成Cron表达式

字段 允许值 允许的特殊字符
 0-59 , - * /
 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /

表达式 意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

特殊字符 意义
* 表示所有值;
? 表示未说明的值,即不关心它为何值;
- 表示一个指定的范围;
, 表示附加一个可能值;
/ 符号前表示开始时间,符号后表示每次递增的值;
L("last") ("last") "L" 用在day-of-month字段意思是 "这个月最后一天";用在 day-of-week字段, 它简单意思是 "7" or "SAT"。 如果在day-of-week字段里和数字联合使用,它的意思就是 "这个月的最后一个星期几" – 例如: "6L" means "这个月的最后一个星期五". 当我们用“L”时,不指明一个列表值或者范围是很重要的,不然的话,我们会得到一些意想不到的结果。
W("weekday") 只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第16天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在day-of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日。
# 只能用在day-of-week字段。用来指定这个月的第几个周几。例:在day-of-week字段用"6#3"指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。
C 指和calendar联系后计算过的值。例:在day-of-month 字段用“5C”指在这个月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在这周日或之后包括calendar的第一天。

在MONTH和Day Of Week字段里对字母大小写不敏感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值