`

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实现定时

    完整示例,直接导入工程即可实现,欢迎各位下载,和评论,谢谢

    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

    spring-timer-quartz.zip_namegnd_spring定时任务

    使用spring实现定时任务,整合spring,springmvc,实现定时任务执行

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

    这个资源中,是我对spring与quartz进行的整合,为了方便以后的使用,以及本着好东西大家分享的原则,在此就上传了,希望各位能提出宝贵的意见或建议,共同进步,谢谢

    Timer、Quartz定时详细分析与代码实例

    该文档经过本人详细整理,jdk Timer、spring quartz定时器的详细对比及代码实例,代码拷贝到程序中就可以运行,经过自己验证。

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业...

    quartz 定时任务

    spring+quartz demo 源码送上很好用,下载之后就可以运行,例子很好看懂的,里面还有timer定时器的一些佩法

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...

    Spring集成Quartz定时任务框架介绍.docx

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等...使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。

    java 中Spring task定时任务的深入理解

    java 中Spring task定时任务的深入理解 ...同时,spring还支持使用Java自带的Timer定时器和Quartz定时框架。限于篇幅,这里将只介绍spring task的使用。 其实,官方文档已经介绍地足够详细,只不过都是英

    Spring 2.0 开发参考手册

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form...

    Spring实现动态修改时间参数并手动开启关停操作

    spring实现定时任务的方式有三种,分别是java自带的timer类、spring task和quartz三种。本文只介绍spring自带的task和第三方quartz,感兴趣的朋友参考下吧

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 ...

    Spring API

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 ...

    Spring中文帮助文档

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置 13.9.2. form标签 ...

    spring chm文档

    13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form...

    spring 定时器

    spring-2.0.6.jar Spring框架的核心包 ...quartz-1.6.0.jar 会用到CronTrigger这个类,通过表达式实现精确的定时 commons-logging-1.1.1.jar 日志管理包 commons-collections-3.2.1.jar 集合工具包

    time-task-demo.zip

    SpringBoot实现定时任务的四种方式: 1.Timer, 2.Timer, 3.Spring Task 4.Quartz。 time-task-demo.zip

    java8源码-learn-demo:平时学习的小例子

    学习java定时任务调度工具Timer demo-03-quartz 学习定时任务调度工具详解quartz demo-04-springboot SpringBoot入门 demo-05-spring-annotation spring中常用注解 demo-06-java8 java8的一些新特性 demo-07-netty-...

Global site tag (gtag.js) - Google Analytics