`

Spring的定时任务开发及对Quartz和Timer支持

阅读更多

相于Quartz和Timer的用法请见开源技术部分:http://zmx.iteye.com/admin/blogs/1479582

一,添加对Spring的支持

web.xml中添加:

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

二,applicationContext.xml配置,以下代码在<beans></beans>之间

使用:Quartz

一.编写调试的作业,作业有两种方式,

1继承QuartzJobBean做为作业

<!--  第一步:编写JOB  -->
	<!-- 第一种方式:使用JobDetailBean -->
	<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<!-- 设置自己的JOB类,要继承QuartzJobBean类,重写executeInternal方法 -->
		<property name="jobClass">
			<value>com.mengya.ExampleJob</value>
		</property>
		<!-- 设置job的属性值 -->
		<property name="jobDataAsMap">
			<map>
				<entry key="timeout">
					<value>50</value>
				</entry>
			</map>
		</property>
	</bean>

 com.mengya.ExampleJob即为作业代码如下:

/**
 * 作业
 * 
 * @author mingxue.zhang@163.com 2012-4-8
 */
public class ExampleJob extends QuartzJobBean {
	//自己的属性
	private String timeout;

	public void setTimeout(String timeout) {
		this.timeout = timeout;
	}

	@Override
	protected void executeInternal(JobExecutionContext arg0)
			throws JobExecutionException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("======>" + arg0.getJobDetail().getName()
				+ sdf.format(new Date()) + "  " + this.timeout);
	}
}

 2.普通JavaBean做为作业

 

<!-- 第二种方式:使用MethodInvokingJobDetailFactoryBean -->
	<!-- 1、自己的JOB类,普通的JavaBean -->
	<bean id="exampleBusinessObject" class="com.mengya.BusinessObject"></bean>
	<!-- 2、包装 -->
	<bean id="methodInvokingJobDetail"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject">
			<ref bean="exampleBusinessObject" />
		</property>
		<property name="targetMethod">
			<value>doIt</value>
		</property>
		<!--
			默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个触发器,
			很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。
			第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false。
		-->
		<property name="concurrent">
			<value>false</value>
		</property>
	</bean>

 com.mengya.BusinessObject是一个普通的java类代码如下:

/**
 * 普通的java类做为做业
 * 
 * @author mingxue.zhang@163.com 2012-4-8
 */
public class BusinessObject {
	public void doIt() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("====>:doIt " + sdf.format(new Date()));
	}

	public void doSomeThing() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(sdf.format(Calendar.getInstance().getTime())
				+ "-------doSomeThing------");
	}
}

 

二配置好做业以后接下来配置定时器,定时器配置也有两种方式

1使用SimpleTriggerBean,如下:

<!-- 第一种方式-->
	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail">
			<!-- see the example of method invoking job above -->
			<ref bean="methodInvokingJobDetail" />
		</property>
		<property name="startDelay">
			<value>10000</value><!-- 启动10秒后开始运行 -->
		</property>
		<property name="repeatInterval">
			<value>50000</value><!-- 每50秒运行 -->
		</property>
	</bean>

2使用CronTriggerBean,用cron表达式

<!-- 第二种方式 -->
	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="exampleJob" />
		</property>
		<property name="cronExpression">
			<!-- run every morning at 6 am -->
			<value>5 0/1 * * * ? *</value><!-- 第分钟的第5秒运行 -->
		</property>
	</bean>

 三用了做业和定时器以后就是组装了

<!-- 第三步:组合调度 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="simpleTrigger" />
				<ref local="cronTrigger" />
			</list>
		</property>
	</bean>

 

使用:Timer

一.编写做业,也有两种方式

1普通的JavaBean

<!-- 1普通的JavaBean -->
	<bean id="checkEmail" class="com.mengya.CheckEmailAddresses">
		<property name="emailAddresses">
			<list>
				<value>mingxue.zhang@163.com</value>
			</list>
		</property>
	</bean>

 com.mengya.CheckEmailAddresses代码如下:

public class CheckEmailAddresses extends TimerTask {
	private List<String> emailAddresses;

	public void setEmailAddresses(List<String> emailAddresses) {
		this.emailAddresses = emailAddresses;
	}

	@Override
	public void run() {
		System.out.println("check:" + emailAddresses);
	}
}

 

2使用MethodInvokingTimerTaskFactoryBean包装

 

<bean id="methodInvokingTask"
		class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
		<property name="targetObject">
			<ref bean="exampleBusinessObject" />
		</property>
		<property name="targetMethod">
			<value>doSomeThing</value>
		</property>
	</bean>

 exampleBusinessObject就是上面的com.mengya.BusinessObject

 

二设置定时器,JDK的Timer比较简单

<bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay">
			<value>5000</value><!-- 启动5秒后开始运行-->
		</property>
		<property name="period">
			<value>50000</value><!-- 每50秒运行 -->
		</property>
		<property name="timerTask">
			<ref local="checkEmail" />
		</property>
	</bean>

	<bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="delay">
			<value>15000</value><!-- 启动15秒后开始运行-->
		</property>
		<property name="period">
			<value>15000</value><!-- 每15秒运行 -->
		</property>
		<property name="timerTask">
			<ref local="methodInvokingTask" />
		</property>
	</bean>

 三,调度

<!-- 第三步:调度 -->
	<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
			<list>
				<ref bean="scheduledTask1" />
				<ref bean="scheduledTask2" />
			</list>
		</property>
	</bean>

 

分享到:
评论

相关推荐

    Spring的quartz和Timer实现定时

    在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...

    Spring 框架自带定时任务和Quartz定时任务

    在这两种方式中,Spring框架提供了自己的定时任务工具Spring Task,以及与专业定时任务框架Quartz集成的能力。 首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类...

    spring定时任务实现

    本文主要探讨了Spring中实现定时任务的三种主要方法:Java的`java.util.Timer`、Quartz库以及Spring自身的Task调度器。 首先,Java的`java.util.Timer`是一个基础的定时任务工具,它可以按照设定的频率执行任务,但...

    Spring 使用Timer quartz区别

    对于`java.util.Timer`,Spring 提供了`org.springframework.scheduling.timer` 包,可以方便地通过Spring的bean配置来管理和调度Timer任务。而对于Quartz,Spring则提供了`org.springframework.scheduling.quartz` ...

    spring-timer-quartz.zip_namegnd_spring定时任务

    首先,Spring对定时任务的支持主要通过`org.springframework.scheduling`包中的接口和类实现。其中,`TaskScheduler`和`TaskExecutor`是两个核心接口,分别用于异步执行周期性任务和一次性任务。然而,如果需要更...

    spring timer、quartz俩种任务调度

    Spring框架提供了对定时任务的强大支持,包括内置的`Spring Timer`和集成第三方的`Quartz Scheduler`。这两种方式都允许开发者灵活地安排和执行周期性任务。下面我们将深入探讨这两种任务调度器及其在Spring中的使用...

    Spring整合Quartz后的简单定时任务示例

    首先,我们要理解Spring对定时任务的支持。Spring框架通过`@Scheduled`注解提供了对简单定时任务的处理。通过在方法上添加这个注解,我们可以设定任务的执行频率,例如每隔一段时间执行一次。然而,对于更复杂的任务...

    Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)

    在JDK 1.3及以后的版本中,`java.util.Timer`类提供了基础的定时任务支持。不过,`Timer`类的功能相对有限,无法精确地在特定时间点执行任务,比如设置每天特定时间执行的任务。 Quartz是一个强大且灵活的开源作业...

    spring2.0 job Quartz 和Time一样的定时任务

    在本篇文章中,我们将聚焦于Spring 2.0中的Job以及Quartz这两款工具,探讨它们如何实现定时任务,以及它们与Java内置的`java.util.Timer`类(简称Time)的异同。 首先,让我们从Java自带的`Timer`类开始。`Timer`是...

    spring 整合 quartz|| timer

    茴香豆的“茴”有几种写法? spring 整合 quartz|| ...我收集的:《spring定时Timer&Quartz》 代码示例,依赖spring2.x.jar quartz1.6.x.jar 相关介绍: http://blog.csdn.net/liu251/archive/2009/08/18/4459514.aspx

    spring2.0学习笔记+spring定时任务

    标题中的“spring2.0学习笔记+spring定时任务”表明了这个压缩包文件包含的是关于Spring框架2.0版本的学习资料,特别是关于Spring的定时任务功能。Spring是Java开发中最广泛应用的轻量级框架之一,它提供了一整套...

    spring3.0+quartz-1.6.0定时

    总结起来,"spring3.0+quartz-1.6.0定时"的实现涉及到Spring框架的定时任务支持和Quartz库的结合使用,通过Spring的配置管理Quartz调度器,定义任务和触发器,最后编写具体任务逻辑的Java类。这种组合在实际项目中...

    spring几种定时执行任务方法 TimeTask Quartz

    本文将深入探讨Spring框架下实现定时任务的几种主流方法,包括使用`java.util.Timer`(即Java定时器)、Spring定时器以及Quartz定时器,旨在帮助开发者根据具体业务场景选择最合适的技术方案。 ### 1. Java定时器...

    Spring提供的三种定时任务机制及其比较

    它们提供了一种简单的定时执行任务的方式,但相比Spring和Quartz,其功能相对有限,不支持复杂的调度策略。 总结来说,选择哪种定时任务机制取决于具体项目的需求。对于需要高度定制、并发控制和复杂调度策略的大型...

    关于 spring 里的定时任务设置

    在Spring框架中,定时任务的实现提供了多种方式,如基于Java Timer API的定时任务和基于Quartz库的定时任务。这两种方法各有优缺点,...在实际开发中,应根据项目规模和对灵活性的需求来决定使用哪种定时任务解决方案。

    Spring定时任务的几种实现

    ### Spring定时任务的几种实现 #### 一、定时任务实现技术分类 在Spring框架中,实现定时任务的主要技术方案有三种: 1. **Java自带的`java.util.Timer`类**:这种实现方式允许用户调度一个`java.util.TimerTask`...

Global site tag (gtag.js) - Google Analytics