Spring+Quartz整合(2)之SimpleTrigger

原文:http://xiaoye4188.iteye.com/blog/875900

下面先看一个实现了Job接口的任务HelloWorldJob:

package com.springQuartz.example;

import java.util.Map;

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

public class HelloWorldJob implements Job{

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		
		Map properties = context.getMergedJobDataMap();
		
		System.out.println("Hello World!");
		System.out.println("Previous Fire Time: "+context.getPreviousFireTime());//上次触发任务的时间
		System.out.println("Current Fire Time: "+context.getFireTime());//当然触发时间
		System.out.println("Next Fire Time: "+context.getNextFireTime());//下次触发时间
		
		System.out.println(properties.get("message"));
		System.out.println();
	}
	
}

这个Job输出"HelloWorld",同时输出上次、本次及下次触发的时间。

我们看一下在applicationContext.xml中的配置:

<bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.springQuartz.example.HelloWorldJob"/>
	<property name="jobDataAsMap">
	     <map>
	        <entry key="triggerMessage" value="Job Message In JobDetail"/> <!--设置JobDetail中的值-->
	     </map>
    </property>
</bean>
	
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="job"/> <!--触发的job引用-->
    <property name="startDelay" value="1000"/> <!--设置延迟1秒后运行-->
    <property name="repeatInterval" value="10000"/> <!--设置每10秒触发一次-->
    <property name="jobDataAsMap">
	      <map>
		  <entry key="triggerMessage" value="Job Message From Trigger"/> <!--设置Trigger中的值-->
	      </map>
    </property>
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref local="trigger"/>	
		</list>
	</property>
</bean>

我们将HelloWorldJob实现成JobDetailBean类,并配置触发器simpleTriggerBean

最后我们的测试类:

2011-01-16 20:48:18,437 INFO - Starting Quartz Scheduler now
Hello World!
Previous Fire Time: null
Current Fire Time: Sun Jan 16 20:48:19 CST 2011
Next Fire Time: Sun Jan 16 20:48:29 CST 2011
Job Message From Trigger

Hello World!
Previous Fire Time: Sun Jan 16 20:48:19 CST 2011
Current Fire Time: Sun Jan 16 20:48:29 CST 2011
Next Fire Time: Sun Jan 16 20:48:39 CST 2011
Job Message From Trigger

下面说明几点:

1)首次触发是输出的Previous Fire Time为null

2)jobDataAsMap的说明:在HelloWorldJob.java中getMergedJobDataMap是JobDetail和Trigger上的JobDataMap的合并,两者数据如果冲突,则Trigger上的数据将覆盖JobDetail中的。运行结果也证明了,我们在Job中设置的值没有输出,而输出了"Job Message From Trigger"。

3)我们看到HelloWorldJob实现了Job接口,代码上依赖了Quartz的接口

下面我们讨论另外一种更普遍的,去除接口依赖的实现

主要的applicationContext.xml文件的配置

<bean id="jobService" class="com.springQuartz.service.JobServiceImpl">
</bean>
	
<bean id="invokeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject">
		<ref bean="jobService" /> <!--目标Job-->
	</property>
	<property name="targetMethod">
		<value>JobServiceImpl中的特定方法</value> <!--目标方法-->
	</property>
	<property name="concurrent">
		<value>false</value> <!--设置是否同步-->
	</property>
</bean>
	
<bean id="jobServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	<property name="jobDetail" ref="invokeJob" />
	<property name="cronExpression" value="5/10 * * * * ?" />
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref local="jobServiceCronTrigger"/>
		</list>
	</property>
</bean>

1)首先我们配置具体的Job信息--JobServiceImpl,这个类可以不实现Quartz中的Job接口

2)最主要的MethodInvokingJobDetailFactoryBean,可以使得1)可行

3)相对于上面的例子,我们使用CronTriggerBean实现trigger,实现更灵活的时间配置

4)默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个Trigger, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值