`
xmong
  • 浏览: 262834 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
Spring调度任务


目录
1 调度任务 1
1.1 实现任务调度的背景 1
1.2 使用JAVA TIMER调度任务 1
1.2.1 创建一个定时器任务 1
1.2.2 创建一个调度定时器 2
1.2.3 启动定时器 2
1.3 使用QUARTZ调度器 3
1.3.1 创建一个Quartz工作 3
1.3.2 调度工作 4
1.3.3 启动工作 5
1.4 按调度计划调度方法 5
1.4.1 MethodInvokingTimerTaskFactoryBean实现Timer Task 5
1.4.2 MethodInvokingJobDetailFactoryBean实现Quartz 6




1 调度任务
在web应用系统中,我们有时候会需要某些事件的发生由系统来引起和完成,而不是所有事件都由用户的动作来引起的。即使应用系统的很多功能都是通过用户的行为来引起的,但有些时候,系统需要根据某些任务调度规划来发起一些事件并完成它。

1.1 实现任务调度的背景
我在做一个ITSM(IT服务管理系统)的时候,需要完成一个功能:每天服务员责任任务处理时间只剩1/3的时候,需要邮件提醒服务员及时处理该任务。在该系统中我使用了SSH框架,对于该任务调度我采用了Spring的调度任务来实现。

1.2 使用Java Timer调度任务
从Java1.3开始,Java SDK就通过java.util.Timer类提供了基本的调度功能。这个类允许你调度一个任务(通过java.util.TimerTask子类定义)按任意的周期运行。
Spring通过TimerFactoryBean向应用程序上下文提供了对java Timer的支持,TimerFactoryBean是一个Spring工厂类,用于在应用程序上下文中生存Java Timer。
Spring中使用Java Timer调度任务的实现:

1.2.1 创建一个定时器任务
创建java Timer定时器任务需要继承java.util.TimerTask.
public class DailyMailTask extends TimerTask{

	private MailTaskService mailTaskService;
	@Override
	public void run() {
		mailTaskService.sendMailTask();
	}

	public MailTaskService getMailTaskService() {
		return mailTaskService;
	}
	public void setMailTaskService(MailTaskService mailTaskService) {
		this.mailTaskService = mailTaskService;
	}
}

Run方法为任务运行时调度执行的方法。
<!--定时器任务-->
<bean id="dailyMailTask" class="bgi.itsm.service.impl.DailyMailTaskImpl">
	<property name="mailTaskService" ref="mailTaskService"></property>
</bean>

1.2.2 创建一个调度定时器
Spring的ScheduledTimerTask定义了一个定时器任务的运行周期和延迟启动定时器。
<!-- 调度定时器任务 -->
	<bean id="scheduledMailTimerTask " class="org.springframework.scheduling.timer.ScheduledTimerTask">
		<property name="timerTask">
			<ref bean=”dailyMailTask "/>
		</property>
		<property name="delay">
			<value>6000</value>
		</property>
		<property name="period">
			<value>600000</value>
		</property>
	</bean>

属性timerTask告诉ScheduledTimerTask运行哪个TimerTask。再次,该属性装配了指向scheduledMailTimerTask的一个引用,它就是DailyMailTask。属性period告诉ScheduledTimerTask以怎样的频度调用TimerTask的run()方法。该属性以毫秒作为单位,它被设置为600000,指定这个任务应该每10分钟运行一次。属性delay允许你指定当任务第一次运行之前应该等待多久。在此指定dailyMailTask的第一次运行相对于应用程序的启动时间延迟6秒钟。

1.2.3 启动定时器
Spring的TimerFactoryBean负责启动定时任务。
<!-- 启动定时器 -->
	<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
		<property name="scheduledTimerTasks">
			<list>
				<ref bean=" scheduledMailTimerTask"/>
			</list>
		</property>
	</bean>

属性scheduledTimerTasks要求一个需要启动的定时器任务的列表。在此只包含一个指向scheduledMailTimerTask的引用。

1.3 使用Quartz调度器
Java Timer只能指定任务执行的频度,但无法精确指定它何时运行,这是它的一个局限性。要想精确指定任务的启动时间,就需要使用Quartz调度器。
Quartz调度任务为我们调度工作提供了更丰富的支持,Quartz调度器不仅可以定义每隔多少毫秒执行一个工作,还允许你调度一个工作在某个特定的时间或日期执行。
Spring中使用Quartz调度任务的实现:

1.3.1 创建一个Quartz工作
创建Quartz定时器任务需要继承Spring的QuartzJobBean.

public class DailyMailJob extends QuartzJobBean{

	private MailTaskService mailTaskService;
	@Override
	protected void executeInternal(JobExecutionContext jobContext)
			throws JobExecutionException {
		mailTaskService.sendMailTask();
	}

	public MailTaskService getMailTaskService() {
		return mailTaskService;
	}
	public void setMailTaskService(MailTaskService mailTaskService) {
		this.mailTaskService = mailTaskService;
	}
}


<!-- 声明邮件工作  -->
	<bean id="quartzMailJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<value> bgi.itsm.action.DailyMailJob </value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<entry key=" mailTaskService">
					<ref bean="mailTaskService"/>
				</entry>
			</map>
		</property>
	</bean>

JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个job的实现。使用JobDetailBean的另一个特别之处是DailyMailJob的mailTaskService属性是间接设置的,通过jobDataAsMap来接受一个map(包含mailTaskService)注入DailyMailJob的mailTaskService属性。

1.3.2 调度工作
Spring提供了两个触发器SimpleTriggerBean和CronTriggerBean。
SimpleTriggerBean与scheduledTimerTasks类似。指定工作的执行频度,模仿scheduledTimerTasks配置。
<!-- 定时调度simple quartz工作  -->
	<bean id="simpleQuartzMailJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail">
			<ref bean="quartzMailJob"/>
		</property>
		<property name="startDelay">
			<value>6000</value>
		</property>
		<property name="repeatInterval">
			<value>600000</value>
		</property>
	</bean>  

属性jobDetail装配了将要被调度的工作,属性repeatInterval告诉触发器SimpleTrigerBean以怎样的频度运行这个工作(以毫秒为单位)。这里我们设置了600000毫秒,指定这个工作每隔10分钟运行一次。属性startDelay可以选择来设置延迟启动工作的第一次执行时间。这里我们设置了6000毫秒,推迟6秒执行该工作。
CronTriggerBean可以更精确地调度工作,我们可以使用CronTriggerBean来调度一个cron任务,CronTriggerBean是Quartz Trigger的另一个spring的子类,这个类允许你更精确地控制任务的运行时间和日期。类似Unix的cron。
<!—调度cron工作-->
	<bean id="cronQuartzMailJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="quartzMailJob"/>
		</property>
		<property name="cronExpression">
			<value>0 30 2 * * ?</value>
		</property>
	</bean>

和SimpleTriggerBean一样,jobDetail属性是告诉触发器要调度那个工作,属性cronExpression告诉触发器何时触发。一个cron表达式有6个或7个由空格分隔的时间元素。从左至右,这些元素的定义如下:
1、秒(0-59);2、分(0-59);3、小时(0-23);4、月份中的日期(1-31);5、月份(1-12或JAN-DEC);6、星期中的日期(1-7或SUN-SAT);7、年份(1970-2099)。
每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素互斥,应该通过设置一个问号(?)来表明你不想设置的那个字段。我们在此定义该任务在每天凌晨两点半开始启动。

1.3.3 启动工作
Spring通过TimerFactoryBean负责启动定时工作。
<!—启动工作-->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
<ref bean="simpleQuartzMailJobTrigger "/>
				<ref bean="cronQuartzMailJobTrigger"/>
			</list>
		</property>
	</bean>

属性triggers接受一组触发器,在此只装配包含simpleQuartzMailJobTrigger b和cronQuartzMailJobTrigger的一个引用列表。

1.4 按调度计划调度方法
在上面Timer Task和Quartz的调度任务实现中,我们都要需要实现一个TimerTask和QuartzJobBean的子类,才能定义调度任务。
Spring还提供了一种不用实现一个TimerTask和QuartzJobBean的子类就可以调度任务类的方法。要达到这一目的可以通过Spring提供的MethodInvokingTimerTaskFactoryBean和MethodInvokingJobDetailFactoryBean来分别支持Timer Task和Quartz的任务调度实现。

1.4.1 MethodInvokingTimerTaskFactoryBean实现Timer Task
要通过MethodInvokingTimerTaskFactoryBean实现Timer Task的任务调度,我们可以将1.2.1中创建一个任务调度换成下面配置:
<!--定时器任务-->
<bean id="dailyMailTask" class="org.springframework.scheduling.timer.MehtodInvokingTimerTaskFactoryBean">
	<property name="targetObject" ref="mailTaskService"></property>
	<property name="targetMehtod ref="sendMialTask"></property>
</bean>

MethodInvokingTimerTaskFactoryBean 在幕后创建了一个TimerTask来对targetObject属性指定的对象调用targetMehod属性指定的方法。

1.4.2 MethodInvokingJobDetailFactoryBean实现Quartz
要通过MethodInvokingJobDetailFactoryBean实现Quartz的工作调度,我们可以将1.3.1中创建一个工作调度换成下面配置:
<!--定时器任务-->
<bean id="dailyMailJob" class="org.springframework.scheduling.Quartz. MethodInvokingJobDetailFactoryBean">
	<property name="targetObject" ref="mailTaskService"></property>
	<property name="targetMehtod ref="sendMialTask"></property>
</bean>

MethodInvokingJobDetailFactoryBean 在幕后创建了一个Quartz JobDetail来对targetObject属性指定的对象调用targetMehod属性指定的方法。
通过这种方式我们可以实现对某个类的某个方法进行调度,从而实现调度任务的功能。



-------------------------------------------------

参考《spring in action》
分享到:
评论

相关推荐

    spring 任务调度

    - **Quartz简介**:Quartz是一个开源的作业调度框架,支持复杂的调度策略,如按日期、时间间隔或CRON表达式调度任务。 - **Spring与Quartz集成**:Spring通过`org.springframework.scheduling.quartz`包提供了一种...

    Spring实现任务调度

    Spring框架提供了强大的任务调度能力,使得开发者能够轻松地在Java环境中实现这一功能。本篇将深入探讨如何利用Spring进行任务调度,并结合代码演示和Quartz库的使用来丰富这一主题。 首先,Spring提供了两种主要的...

    spring 任务调度实现代码例子

    在Spring框架中,任务调度是一项重要的功能,它允许开发者安排任务在特定的时间点或周期性地执行。这个“spring 任务调度实现代码例子”很可能是包含了一些示例代码,用于演示如何在Spring应用中配置和使用任务调度...

    Spring实现任务调度.rar

    Spring框架提供了强大的任务调度能力,使得开发者能够轻松地集成和管理定时任务。本资料“Spring实现任务调度”将深入探讨如何在Spring中设置和管理定时任务。 首先,我们需要理解Spring中的任务调度机制。Spring...

    spring分布式任务调度

    7、自定义任务参数:支持在线配置调度任务入参,即时生效; 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配...

    Spring整合任务调度框架Quartz

    Spring 整合任务调度框架 Quartz 在软件开发中,任务调度框架是非常重要的一部分,它可以帮助开发者更好地管理和执行各种任务。在 Java 领域中,Quartz 是一个非常流行的任务调度框架,而 Spring 是一个非常流行的 ...

    spring任务调度(Quartz )

    Spring中的任务调度是实现应用程序自动化运行任务的重要工具,而Quartz是Java领域广泛使用的开源任务调度框架。在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作...

    Spring Quartz 任务调度实例

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...

    使用spring调度

    Spring框架是Java开发中广泛使用的轻量级框架,它提供了许多功能,其中之一就是调度任务执行。Spring调度允许开发者安排一次性或周期性的任务执行,这对于实现后台服务、定时任务或者批处理作业非常有用。本篇文章将...

    Spring任务调度demo

    在IT行业中,Spring框架是Java开发中的重要组成部分,它提供了丰富的功能,其中之一就是任务调度。本篇文章将深入探讨Spring任务调度的实现方法,以及如何利用Quartz库来增强任务管理能力。 首先,让我们理解Spring...

    spring动态定时调度任务

    `SchedulerFactoryBean`是Spring调度工厂,用于创建Quartz的Scheduler实例,并通过`triggers`属性指定一个或多个触发器,这里的`cronTrigger`引用了上面配置的`CronTriggerBean`。 在`ScheduleInfoAction`的`...

    spring quartz 任务调度

    Spring框架作为一个全面的企业级应用开发解决方案,提供了强大的任务调度支持,而Quartz则是一个流行的开源作业调度库,能够与Spring很好地集成。现在,我们就来深入探讨"spring quartz 任务调度"这一主题。 首先,...

    spring任务调度实例

    而在Spring框架中,任务调度是一个重要的特性,用于自动执行预定的任务。本实例主要探讨了Spring如何实现任务调度,特别是使用Quartz和Timer两种不同的方法。 首先,Quartz是一个开源的作业调度框架,它允许开发者...

    spring实现任务的自动调度所需的jar包

    在Spring框架中,任务调度是一项重要的功能,它允许开发者安排任务在特定的时间点或周期性地执行。Quartz是一个流行的任务调度库,被广泛用于Java应用程序中,包括Spring项目。在本篇中,我们将深入探讨如何使用...

    Spring Quartz 任务调度

    **Spring Quartz 任务调度** Spring Quartz 是一个基于 Java 的任务调度框架,它允许开发者定义定时任务并在应用程序中灵活地调度这些任务。这个框架是 Spring 和 Quartz Scheduler 的集成,提供了与 Spring 框架的...

    spring定时任务关键jar包(齐全)

    `spring-context-support.jar`是Spring框架对Quartz和Commons JCR等第三方调度库的支持,同时也包含Spring自己的`TaskExecutor`和`TaskScheduler`接口,用于实现异步任务和定时任务。 1. **Spring TaskExecutor**: ...

    20190821_Spring任务定时(任务调度).md

    Spring 定时器 任务调度 怎么在项目中写定时任务 怎么配置一些环境

    spring的三种任务调度实现方式lib

    你可以使用`@Scheduled`注解来定义一个定时任务,或者通过`TaskScheduler`的`schedule`方法来编程式地调度任务。`TaskScheduler`支持基于固定延迟、固定间隔和cron表达式等多种调度策略。例如,你可以使用`@...

    spring任务调度器

    java spring任务调度器

    spring定时任务所需jar

    总的来说,Spring的定时任务功能强大且易于使用,通过合理的配置和jar包的集成,我们可以轻松地实现各种定时任务需求,无论是简单的周期性任务还是复杂的调度逻辑。在项目中正确地引入这些jar包,可以极大地提高开发...

Global site tag (gtag.js) - Google Analytics