quartz定时任务调度学习

----------记录自己工作中遇到的问题,不足错误之处望指点一二-----------

Quartz是一个完全由java编写的开源作业调度框架。

主要是学习在web项目中如何配置quartz!

第一步配置 quartz.properties 文件  

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================
org.quartz.scheduler.instanceName = org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool  
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure Plugins 
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = /quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10

第一部分 调度器属性       

instanceName 属性一般都是默认配置

第二部分 线程池属性  

org.quartz.threadPool.class   这个值是一个实现了 org.quartz.spi.ThreadPool 接口的类的全限名称。Quartz 自带的线程池实现类是 org.quartz.smpl.SimpleThreadPool,它能够满足大多数用户的需求。这个线程池实现具备简单的行为,并经很好的测试过。它在调度器的生命周期中提供固定大小的线程池。你能根据需求创建自己的线程池实现,如果你想要一个随需可伸缩的线程池时也许需要这么做。这个属性没有默认值,你必须为其指定值。

threadCount 属性控制了多少个工作者线程被创建用来处理 Job。原则上是,要处理的 Job 越多,那么需要的工作者线程也就越多。threadCount 的数值至少为1。Quartz 没有限定你设置工作者线程的最大值,但是在多数机器上设置该值超过100的话就会显得相当不实用了,特别是在你的 Job 执行时间较长的情况下。这项没有默认值,所以你必须为这个属性设定一个值。  

threadPriority 属性设置工作者线程的优先级。优先级别高的线程比级别低的线程更优先得到执行。threadPriority 属性的最大值是常量 java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量 java.lang.Thread.MIN_PRIORITY,为1。这个属性的正常值是 Thread.NORM_PRIORITY,为5。大多情况下,把它设置为5,这也是没指定该属性的默认值。


第三部分 插件配置 

主要是配置org.quartz.plugin.jobInitializer.fileName 这个文件要在classpath下 别的都可以字面理解的

overWriteExistingJobs  覆盖现有jobs              scan Interval  扫描间隔 

overWriteExistingJobs 设置为false时就不需要   scan Interval这个属性了


第二部 quartz_jobs.xml   配置jobs

<?xml version='1.0' encoding='utf-8'?>
<quartz>
<job>
	<job-detail>
		<name>helloWordTask</name>
	  	<group>DEFAULT</group>
	  	<description>测试任务</description>
	  	<job-class>com.yeshun.jobs.HelloWordTask</job-class>
	  	<job-data-map allows-transient-data="true">
	   	<entry>
	    	<key>ilisKe</key>
	    	<value>ilisV</value>
	   	</entry>
	   </job-data-map>
 	</job-detail>
	<trigger>
		<cron>
			<name>helloWordTaskCr</name>
			<group>DEFAULT</group>
			<job-name>helloWordTaskJb</job-name>
			<job-group>DEFALUT</job-group>
			<cron-expression>0/10 * * * * ?</cron-expression>
		</cron>
	</trigger>
</job>

</quartz>

现在就只有一个job  可以配置多个 使用job标签

<cron-expression>0/10 * * * * ?</cron-expression> 就是配置多少时间执行一次(我的是10秒执行一次)

Cron表示式示例(网上找的)
表示式 说明
"0 0 12 * * ? " 每天12点运行
"0 15 10 ? * *" 每天10:15运行
"0 15 10 * * ?" 每天10:15运行
"0 15 10 * * ? *" 每天10:15运行
"0 15 10 * * ? 2008" 在2008年的每天10:15运行
"0 * 14 * * ?" 每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。
"0 0/5 14 * * ?" 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。
"0 0/5 14,18 * * ?" 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
"0 0-5 14 * * ?" 每天14:00点到14:05,每分钟运行一次。
"0 10,44 14 ? 3 WED" 3月每周三的14:10分到14: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 2007-2009" 在2007,2008,2009年每个月的最后一个星期五的10:15分运行。
"0 15 10 ? * 6#3" 每月第三个星期五的10:15分运行。



第三部 web.xml

还需要设置web.xml启用


<!--直接配置 Quartz调度器 -->>
 <servlet> 
   <servlet-name>QuartzInitializer</servlet-name> 
   <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> 
   <init-param>
     <param-name>shutdown-on-unload</param-name>
     <param-value>true</param-value>
   </init-param>
   <init-param>
    <param-name>config-file</param-name>
    <param-value>quartz.properties</param-value> 
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>


最后  写一个需要定时作业的类,这个类必须实现job接口实现execute方法

根据上面的配置我写了一个HelloWordTask

package com.yeshun.jobs;

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

public class HelloWordTask implements Job {

	public void execute(JobExecutionContext jbcontext) throws JobExecutionException {
		//to do ...
		String name = jbcontext.getJobDetail().getName();
		String description = jbcontext.getJobDetail().getDescription();
		System.out.println("hello world!");
		System.out.println("job " + name+ " " + description + " executing...   ");
	}

}

那一起配好,运行项目后,每隔10秒就会打印

hello world!
job helloWordTask 测试任务 executing...   




补充

ps:在之前的一个项目中,定义了一个job每2分钟执行一次,可是当2分钟这个job还没执行完的时候,这时候又会创建一个新的job去跑,就产生了数据重复处理(并发)。

     在之前的配置文件中有配置    org.quartz.threadPool.threadCount = 3     //最多创建3个job....

   例子:短信系统,没2分钟扫描一次发送表,当一段时间内数据量很大时,开启的job在2分钟内没处理完,那么它又会再new一个job去跑,如果还没处理完呢,再创建一个新的

               一直循环,直到超过最大配置的job数量。这样就会造成一条短信被重复发送了2次,3次...

在上文蚕蛹的quartz的CronTrigger触发器,这个比较适合指定类似一个日历一个的进程,(每天的10点执行,每月的10号执行,之类的)

还有一个简单的触发器SimpleTrigger,个人感觉类似于例子中的短信系统每隔几秒,几分钟这类job比较适合用SimpleTrigger。

SimpleTrigger:举个例子 设置每隔20秒处理一个job,在方法中让线程sleep25秒,那么job开始过20秒这个job没有执行完,这是就不会去创建新的job,会选择跳过,然后再等待20秒,这时这个job已经跑完了,这时再执行。

上代码:

package com.yeshun.jobs;

import org.quartz.StatefulJob;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloWordTask implements StatefulJob {

	public void execute(JobExecutionContext jbcontext) throws JobExecutionException {
		//to do ...
		String name = jbcontext.getJobDetail().getName();
		String description = jbcontext.getJobDetail().getDescription();
		System.out.println("hello world!");
		System.out.println("job " + name+ " " + description + " executing...   ");
	}

}

基本没变只是实现了StatefulJob 这个类


然后配置文件

<?xml version='1.0' encoding='utf-8'?>
<quartz>
<job>
	<job-detail>
		<name>helloWordTask</name>
	  	<group>DEFAULT</group>
	  	<description>测试任务</description>
	  	<job-class>com.yeshun.jobs.HelloWordTask</job-class>
	  	<job-data-map allows-transient-data="true">
	   	<entry>
	    	<key>ilisKe</key>
	    	<value>ilisV</value>
	   	</entry>
	   </job-data-map>
 	</job-detail>
	<trigger>
		<simple>
			<name>helloWordTaskCr</name>
			<group>DEFAULT</group>
			<job-name>helloWordTaskJb</job-name>
			<job-group>DEFALUT</job-group>
			<!-- 无限期地重复每10秒  -->
                        <repeat-count>-1</repeat-count>  
                        <repeat-interval>120000</repeat-interval>
		</simple>
	</trigger>
</job>

</quartz>

其他一样!


附上源码地址点击打开链接

附上quartz的中文api 点击打开链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值