Java的Timer类和OpenSymphony的Quartz调度器是两个流行的调度API。Spring为这两个调度器提供了一个抽象层,可以更容易的使用他们
spring+timer
1 .使用java Timer调度任务
第一步 web.xml
<!--*********************** spring setting ***********************-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContextTimeTask.xml
</param-value>
</context-param>
第二步 配置applicationContextTimeTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--
****************使用java Timer调度任务*********************
使用java Timer调度第一步是从java.util.TimerTask派生一个任务声明本身只是将EmailReportTask放到应用上下文,并在testBean属性装配TestBean在调度之前不会做任何事。
-->
<bean id="testBean" class="com.photo.test.TestBean"/>
<bean id="reportTimerTask" class="com.photo.task.EmailReportTask">
<property name="testBean">
<ref bean="testBean"/>
</property>
</bean>
<!--
Spring的ScheduledTimerTimerTask定义了一个定时器任务的运行周期。应该如下装配一个ScheduledTimerTasktimerTask告诉ScheduledTimerTask运行哪个TimerTask,这里该装配属性指向reportTimerTask的一个引用。属性period告诉ScheduledTimerTask以怎样的频率调用TimerTask的run()方法。这个属性以毫秒作为单位,86400000指定该任务每24小时运行一次10X1000属性scheduledTimerTasks 要求一个需要启动的定时器任务列表。ScheduledTimerTask有一个delay属性, 允许你指定当任务第一次运行之前应该等多久。如,EmailReportTask的第一次运行延迟5毫秒
-->
<bean id="scheduledReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask">
<ref bean="reportTimerTask"/>
</property>
<property name="period">
<value>10000</value>
</property>
<property name="delay">
<value>5000</value>
</property>
</bean>
<!--Spring 的TimerFactoryBean负责启动定时任务。按以下方式在Spring配置文件里声明它-->
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledReportTask"/>
</list>
</property>
</bean>
</beans>
第三步 相关类的编写
EmailReportTask.java
public class EmailReportTask extends TimerTask {//必需继承TimerTask
Log log= LogFactory.getLog(EmailReportTask.class);
public EmailReportTask() {
}
public void run() {//这个函数是调度任务执行的入口
log.debug("task begin :"+testBean.greeting);
}
private TestBean testBean;//这里实现spring的依赖注入
public void setTestBean(TestBean testBean) {
this.testBean = testBean;
}
}
testBean.java
public class TestBean {
public String greeting="hello,world";
}
spring+Quartz
Quartz 作业调度框架所提供的 API 在两方面都表现极佳:既全面强大,又易于使用。Quartz 可以用于简单的作业触发,也可以用于复杂的 JDBC 持久的作业存储和执行。
第一步 同上
第二步 配置applicationContextTimeTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.photo.task.EmailReportTask2</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="testBean">
<ref bean="testBean"/>
</entry>
</map>
</property>
</bean>
<!--用它来指定一个工作应以怎样的频率运行,及第一次运行工作前应等多久-->
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="reportJob"/>
</property>
<property name="startDelay">
<value>3600000</value>
</property>
<property name="repeatInterval">
<value>86400000</value>
</property>
</bean>
<!--
CronTriggerBean允许更精确的控制任务的运行时间。如果要在每天的6:00运行任务可以按照以下方式声明一个CronTriggerBean
0 0 6 * * ?
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)
每一个元素都可以显示规定的一个值,一个区间(9-14),一个列表(9,12,14)或一个通配符(*)月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号(?)来表明不想设置那个字段
对于cronReportTrigger我们设置的cronExpression为 0 0 6 * * ?可以读作任意月份任何日期的6时0分0秒执行触发器
在使用的过程中,需要再对cronExpression的配置解释一下,如果没有使用过unix的cron,这里确实有点让人迷惑,我便在这里迷惑了一把。
Cron表达式是字符串,它由六个或七个子表达式组成,它描述了不同的调度细节。这些子表达式被白色表达式隔开,格式为* * * * * *
以下的表格对表达式做出了解释
域 是否必须 允许的值 允许的字符
Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W C
Month YES 1-12 or JAN-DEC, - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L C #
Year NO empty,1970-2099, - * /
比如:字符串“0 0 12 ? * WEB 意味着每周三上午12:00。
特殊字符的一些说明:
* 表示的是所有的值,比如在秒的位置上有* 则表示为每一秒种。所以,你在表示每5分钟执行一次的时候便不能写成 * 0/5 * * * ? 而应该是0 0/5 * * * ?
? 表示没有指定特别的值,是允许为月的某一天或者周的某一天字段的。它被用来限定"没有限定值"。这是有用的,当你需要限定一些事情在一个或两个字段中,但不是这里的。
有一个特别需要主意的地方便是*与?的搭配使用。比如在Day of month与Day of week全是* ,那边自相矛盾了。官网中给出的例子没出现过这种情况。
- 表示范围,比如Hours域中10-12,则表示 "the hours 10, 11 and 12".
,表示指定特别的附加值,比如"MON,WED,FRI" 在 day of week 域表示"the days Monday, Wednesday, and Friday"
/ 表示指定的增长范围。比如"0/15" 在秒的区域表示"0, 15, 30, and 45"秒。
"L"字符是允许用来月某天和周某天字段。这个字符是一个"last"的缩写,但是它有不同的意义在两个字段的其中之一。例如,这个值"L"在月字段的某一天意味着" 这个月的最后一天",31或者28等等。
-->
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="reportJob"/>
</property>
<property name="cronExpression">
<value>0/5 * * * * ?</value>
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronReportTrigger"/>
</list>
</property>
</bean>
</beans>
第三步 相关类的编写
EmailReportTask2.java
public class EmailReportTask2 extends QuartzJobBean {
Log log = LogFactory.getLog(EmailReportTask.class);
public EmailReportTask2() {
}
//这个函数是调度任务执行的入口
protected void executeInternal(JobExecutionContext jobExecutionContext) throws org.quartz.JobExecutionException {
log.debug("task 2 begin :" + testBean.greeting);
}
private TestBean testBean;//这里实现spring的依赖注入
public void setTestBean(TestBean testBean) {
this.testBean = testBean;
}
}
分享到:
相关推荐
### 一、Spring时间调度简介 Spring框架内置了多种任务调度的支持方式,其中最常用的是基于`org.springframework.scheduling`包下的任务调度组件。这些组件使得开发者能够轻松地在Spring应用中实现定时任务的功能。...
在IT行业中,Spring框架是Java开发中的一个核心组件,它提供了丰富的功能,包括但不限于依赖注入、AOP(面向切面编程)以及我们今天要讨论的重点——任务调度。Spring的任务调度模块使得开发者能够在应用中轻松地...
在Spring框架中,任务调度是一项重要的功能,它允许开发者安排任务在特定的时间点或周期性地执行。这个“spring 任务调度实现代码例子”很可能是包含了一些示例代码,用于演示如何在Spring应用中配置和使用任务调度...
在Spring框架中,定时任务调度是一项非常重要的功能,它允许我们按照预定的时间间隔执行特定的任务。这个"Spring定时调度简单实现源码"很显然是一个关于如何在Spring中配置和使用定时任务的示例代码包。下面我们将...
在IT行业中,任务调度是一项关键功能,特别是在大型企业级应用中,它允许系统在特定时间自动执行预定的任务。Spring框架提供了强大的任务调度能力,使得开发者能够轻松地在Java环境中实现这一功能。本篇将深入探讨...
在IT行业中,任务调度是一项关键功能,特别是在大型企业级应用中,它允许系统按照预定的时间间隔执行特定的任务,如数据同步、报表生成等。Spring框架提供了强大的任务调度能力,使得开发者能够轻松地集成和管理定时...
Spring框架是Java开发中广泛使用的轻量级框架,它提供了许多功能,其中之一就是调度任务执行。Spring调度允许开发者安排一次性或周期性的任务执行,这对于实现后台服务、定时任务或者批处理作业非常有用。本篇文章将...
Spring中的任务调度是实现应用程序自动化运行任务的重要工具,而Quartz是Java领域广泛使用的开源任务调度框架。在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作...
在IT行业中,Spring框架是Java开发中的重要组成部分,它提供了丰富的功能,其中之一就是任务调度。本篇文章将深入探讨Spring任务调度的实现方法,以及如何利用Quartz库来增强任务管理能力。 首先,让我们理解Spring...
而在Spring框架中,任务调度是一个重要的特性,用于自动执行预定的任务。本实例主要探讨了Spring如何实现任务调度,特别是使用Quartz和Timer两种不同的方法。 首先,Quartz是一个开源的作业调度框架,它允许开发者...
在IT行业中,Spring框架是Java领域最常用的轻量级开源框架之一,它的功能强大且全面,其中就包括了定时任务调度。本篇文章将探讨如何在Spring中实现定时调度,并将调度信息持久化到数据库中,这在实际业务场景中非常...
Spring Quartz 调度器是Java开发中常用的一种任务调度框架,它结合了Spring框架的强大功能与OpenSymphony的Quartz库,使得开发者能够轻松地在应用中添加定时任务。在myEclipse环境中,借助Tomcat服务器和JDK运行环境...
Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...
《Spring任务调度配置详解:Spring+Quartz的整合应用》 在Java开发中,任务调度是不可或缺的一部分,Spring框架提供了与Quartz集成的能力,使得我们可以方便地管理和执行定时任务。本文将详细介绍如何通过Spring和...
在Spring框架中,任务调度是一项重要的功能,它允许开发者安排任务在特定的时间点或周期性地执行。Quartz是一个流行的任务调度库,被广泛用于Java应用程序中,包括Spring项目。在本篇中,我们将深入探讨如何使用...
在Spring框架中,调度器(Scheduler)是一个非常重要的组件,它允许我们定义任务并在特定时间点执行这些任务。Spring提供了Spring Integration和Spring Batch等模块来支持调度任务,但这里我们主要关注的是Spring ...
Spring框架提供了一个强大的任务调度模块——Spring Task,也被称为Spring Batch,它支持基于时间的任务调度和基于事件的任务触发。 首先,我们需要在`pom.xml`文件中添加Spring相关的依赖。这通常包括`spring-...
【Spring 3.0作业调度】是Spring框架中的一个重要组件,它允许开发者在特定时间点或按照预定的周期执行任务,极大地增强了应用的自动化能力。本文将深入探讨Spring 3.0中的作业调度机制,包括其重要性、基本概念、...
Quartz是一款开源的作业调度框架,它允许程序在指定的时间执行特定的任务,广泛应用于Java企业级应用中。Spring框架与Quartz的集成使得在Spring应用中管理定时任务变得更加方便。以下将详细介绍Quartz的使用、Spring...
本篇文章将深入探讨Java中的三种主要时间调度实现:`Timer`、`TimerTask`、以及第三方库`Quartz`和`Spring`的定时任务功能。 ### 1. Java `Timer` 和 `TimerTask` `java.util.Timer` 类提供了一个调度任务的方法,...