Quartz2.1+Spring4实现任务调度简单示例

本文介绍如何在Spring框架中使用Quartz进行任务调度,包括两种配置方式:使用JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean。前者要求任务类实现Job接口,后者则不需要。同时对比了两种方式下任务类实例的创建机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)applicationContext.xml配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="jobExample02" class="example.JobExample02"></bean>

	<!-- 配置quartz,有两种方式 -->
	<!-- 方式一:使用jobDetailFactoryBean,任务类必须实现job接口 -->
	<!-- <bean id="jobDetailFactoryBean" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> -->
	<!-- 指定job接口实现类,value值为全类名 -->
	<!-- <property name="jobClass" value="example.JobExample01"></property> 
		<property name="jobDataAsMap"> <map> <entry key="triggerMessage" value="example.JobExample 
		Message"> </entry> </map> </property> </bean> -->
	<!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不用实现job接口,通过targetClass属性值指定的类的targetMethod属性值指定执行方法的名称 -->
	<bean id="methodInvokingJobDetailFactoryBean"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<!-- 配置调度目标类 -->
		<property name="targetObject" ref="jobExample02"></property>
		<!-- 配置执行方法名称 -->
		<property name="targetMethod" value="execute"></property>
		<property name="concurrent" value="false"></property>
	</bean>

	<!-- 配置简单调度触发器 -->
	<!-- <bean id="simpleTriggerFactoryBean" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> 
		<property name="jobDetail" ref="jobDetailFactoryBean"></property> -->
	<!-- 设置延迟1秒执行 -->
	<!-- <property name="startDelay" value="1000"></property> -->		<!-- 设置每10秒触发一次 -->
	<!-- <property name="repeatInterval" value="10000"></property> -->
	<!-- <property name="jobDataAsMap"> <map> <entry key="triggerMessage" value="example.JobExample 
		Message。。。。。。"> </entry> </map> </property> -->
	<!-- </bean> -->

	<bean id="cronTriggerFactoryBean"
		class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property>
		<property name="cronExpression" value="5/10 * * * * ?"></property>
		<property name="jobDataAsMap">
			<map>
				<entry key="triggerMessage" value="example.JobExample 
		Message。。。。。。">
				</entry>
			</map>
		</property>

	</bean>

	<!-- 配置调度工厂 -->
	<!-- <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
		<property name="triggers"> <list> <ref bean="simpleTriggerFactoryBean" /> 
		</list> </property> </bean> -->

	<bean id="schedulerFactoryBean"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="cronTriggerFactoryBean" />
			</list>
		</property>
	</bean>
</beans>


(2)方式一:实现Job接口,重写public void execute(JobExecutionContext paramJobExecutionContext)
throws JobExecutionException方法

package example;

import java.util.Map;

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

public class JobExample01 implements Job {

	public JobExample01() {
		super();
		System.err.println("------------------------------------------");
		System.out.println("JobExample......");
	}

	@Override
	public void execute(JobExecutionContext paramJobExecutionContext)
			throws JobExecutionException {

		System.out.println("上次触发时间:"
				+ paramJobExecutionContext.getPreviousFireTime());
		System.out.println("当前触发时间:" + paramJobExecutionContext.getFireTime());
		System.out.println("下次触发时间:"
				+ paramJobExecutionContext.getNextFireTime());
		Map<?, ?> map = paramJobExecutionContext.getMergedJobDataMap();
		System.out.println(map.get("triggerMessage"));

	}

}


(3)方式二:在applicationContext.xml文件配置使用MethodInvokingJobDetailFactoryBean,任务类可以不用实现job接口,通过targetClass属性值指定的类的targetMethod属性值指定执行方法的名称。

package example;

public class JobExample02 {

	public JobExample02() {
		super();
		System.err.println("------------------------------------------");
		System.out.println("JobExample......");
	}

	public void execute() {
		System.out.println(this);
		System.out.println("example.JobExample Message。。。。。。");

	}

}


测试类:

package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {

		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"applicationContext.xml");

	}
}


测试结果如下:

(1)方式一:


(2)方式二:


从运行结果:可以看出方式一每次调度简单示例都会创建一个新的对象,而方式二则是单例的,对象只创建一次。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值