当前位置:首页 > 开发 > 系统架构 > 架构 > 正文

Spring4+quartz2的配置和代码方式调度

发表于: 2015-04-23   作者:Everyday都不同   来源:转载   浏览:
摘要: 前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……   quartz定时任务必须搞清楚几个概念: JobDetail——处理类 Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象 Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发

前言:这些天简直被quartz虐哭。。因为quartz 2.x版本相比quartz1.x版本的API改动太多,所以,只好自己去查阅底层API……

 

quartz定时任务必须搞清楚几个概念:

JobDetail——处理类

Trigger——触发器,指定触发时间,必须要有JobDetail属性,即触发对象

Scheduler——调度器,组织处理类和触发器,配置方式一般只需指定触发器(因为触发器已经指定了对应的处理类),代码方式则需同时指定触发对象和触发器。

 

代码方式中,quartz2.x一般都是用相应工厂类来建立JobDetail和Trigger的。

 

一般来说,任务调度有2中方法,一种是只把Job定义为一个普通类,但同时在配置文件中必须指定targetObject和属性,废话不多说,上demo:

 

<!-- 任务类 -->
	 <bean id="test" class="org.test.job.Task1" />
	<bean id="task1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="test" />
		</property>
		<property name="targetMethod">
			<value>step1</value>
		</property>
	</bean>
	
	<bean id="task2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="test" />
		</property>
		<property name="targetMethod">
			<value>step2</value>
		</property>
	</bean>
	
	<bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="task1" />
		</property>
		<property name="cronExpression">
			<value>0 0 11 * * ? *</value>
		</property>
	</bean>
	
	<bean id="trigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="task2" />
		</property>
		<property name="cronExpression">
			<value>0 02 11 * * ? *</value>
		</property>
	</bean>
	
	<bean id="schedule1" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="trigger1" />
				<ref bean="trigger2" />
			</list>
		</property>
	</bean>

 当然:我上面是在1个类里面定义2个方法,分别指定这2个方法的触发时间——这种情况不太常见,如果不需要,减少task和trigger就行。但对于我这里说到的这种情况,有无简化方法我暂时还未发现……

 

 

在这里,类Task1只是一个很普通的类。

 

方式2:继承QuartzJobBean类,同时必须重写executeInternal方法。

配置如下:

 

<!-- 任务类 -->
	 <bean id="job1" class="org.test.job.TestJob1" />
	<bean id="job2" class="org.test.job.TestJob2" /> 
	
	<!-- 定义触发器来管理任务bean -->
	<bean id="cronTriggerJob1" 
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
		p:cronExpression="0 52 17 * * ? *" >
		<property name="jobDetail">
			<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
			p:durability="true"
			p:jobClass="org.test.job.TestJob1"
			 />
		</property>
	</bean>
	
<bean id="cronTriggerJob2" 
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
		p:cronExpression="0 30 17 * * ? *" >
		<property name="jobDetail">
			<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean"
			p:durability="true"
			p:jobClass="org.test.job.TestJob2"
			 />
		</property>
	</bean>
	<!-- 执行实际的调度 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTriggerJob1" />
			 	<ref bean="cronTriggerJob2" /> 
			</list>
		</property>
	</bean> 

 

 

这种方式还有代码写法:

 

Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
			JobDetail jobDetail = JobBuilder.newJob(cla)
					.setJobData(new JobDataMap(Map map)).build();

                      //在某一时刻触发
			Trigger trigger = TriggerBuilder.newTrigger().startAt(Date date).build();
                   //在指定cron表达式的时间点触发
//		Trigger trigger = TriggerBuilder.newTrigger()
//				.withSchedule(CronScheduleBuilder.cronSchedule(String cron)).build();
                      //调度器将任务类与触发器关联
			scheduler.scheduleJob(jobDetail, trigger);
			scheduler.start();

 

 

Spring4+quartz2的配置和代码方式调度

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
PS:今天上午,非常郁闷,有很多简略基础的问题搞得我有些迷茫,哎,代码几天不写就忘。现在又不当CO
注释:本文最新勘误文地址:http://blog.csdn.net/watkinsong/article/details/9849973 包含最新的
资源调度器是Hadoop集群中一个比较重要的模块,最初的hadoop资源调度器是基于队列形式的FIFO调度的,
资源调度器是Hadoop集群中一个比较重要的模块,最初的hadoop资源调度器是基于队列形式的FIFO调度的,
资源调度器是Hadoop集群中一个比较重要的模块,最初的hadoop资源调度器是基于队列形式的FIFO调度的,
资源调度器是Hadoop集群中一个比较重要的模块,最初的hadoop资源调度器是基于队列形式的FIFO调度的,
资源调度器是Hadoop集群中一个比较重要的模块,最初的hadoop资源调度器是基于队列形式的FIFO调度的,
转自:http://www.cnblogs.com/zhangkai2237/archive/2012/03/22/2410890.html   Session又称为会
1.最简单的方式,tomcat当中进行配置 用记事本打开tomcat 安装路径下bin 文件夹中的Catalina.bat,在
根据代理机制不同,有以下几种配置方式: 先定义一个DAO接口及实现类: Java代码 public interface I
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号