Spring框架提供了执行和调度任务的抽象,支持线程池或者在应用服务器环境中代理给CommonJ. Spring也集成了支持使用JDK
Timer和Quartz调度库提供的Quartz Scheduler来实现任务调度的类.两种调度器通过分别引用可选的Timer或者org.quartz.Trigger实例的工厂Bean来进行设置. 另外,还有一个可以同时满足Timer和Quartz Scheduler的类允许我们调用一个存在的目标对象的方法.

在这篇教程中,我们将向你展示在Spring中如何实现一个JDK Timer的例子,然后我们将使用Quartz Scheduler来丰富这个例子.

我们首选的开发环境是Eclipse. 我们使用的Eclipse版本是Eclipse Juno (4.2)同时集成了版本为 3.1.0的Maven插件.
你可以从这里下载Eclipse,然后从这里下载Maven插件.Eclipse中Maven插件的安装不在本教程的范围之内,我们将不在此进行讨论.
我们还用到了Spring3.2.3和JDK 7_u_21.

让我们开始吧.

雅典娜拉

翻译于 4天前

0人顶

 翻译的不错哦!

1. 创建一个新的maven项目

Go to File -> Project ->Maven -> Maven Project.

在 “Select project name and location”向导页, 选择 “Create a simple project (skip archetype selection)”这个选项, 其他默认,点击“Next”.

在 “Enter an artifact id” 这个页面, 你可以定义你的项目名称和主包. 我们将设置 “Group Id” 的值为"com.javacodegeeks.snippets.enterprise"以及 “Artifact Id” 的值为"springexample". 这亮相是项目的所在包"com.javacodegeeks.snippets.enterprise.springexample"和项目名称"springexample".点击 “Finish”退出向导,会自动简历项目.

Maven 项目结构:

It consists of the following folders:

  • /src/main/java 文件夹,包含程序源文件信息 ,
  • /src/test/java 文件夹是所有测试信息contains all source files for unit tests,
  • /src/main/resources文件夹放置所有配置文件
  • /target 文件夹 放置编译和打包好的文件
  • pom.xml是项目对象模型(POM)文件. 这一个文件包含项目所有的相关配置信息

你要爪子

翻译于 5天前

0人顶

 翻译的不错哦!

2. 添加Spring 3.2.3依赖

  • 在POM编辑器的 “Overview” 页中,定位到“Properties”一节,进行下列变更:

    创建一个新的名为org.springframework.version的属性把其值设置为3.2.3.RELEASE.
  • 切换到“Dependencies”页上,创建下面的依赖(你需要在该页的“Dependency Details”部分中填写“GroupId”, “Artifact Id”和“Version”等字段):

    Group Id : org.springframework Artifact Id : spring-web Version :${org.springframework.version}

或者,你也可以直接在Maven的pom.xml文件中添加Spring依赖,即直接在POM编辑器的“Pom.xml”页上进行编辑,如下所示:

 

pom.xml:

03     <modelVersion>4.0.0</modelVersion>
04     <groupId>com.javacodegeeks.snippets.enterprise</groupId>
05     <artifactId>springexample</artifactId>
06     <version>0.0.1-SNAPSHOT</version>
07  
08     <dependencies>
09         <dependency>
10             <groupId>org.springframework</groupId>
11             <artifactId>spring-core</artifactId>
12             <version>${spring.version}</version>
13         </dependency>
14         <dependency>
15             <groupId>org.springframework</groupId>
16             <artifactId>spring-context</artifactId>
17             <version>${spring.version}</version>
18         </dependency>
19     </dependencies>
20  
21     <properties>
22         <spring.version>3.2.3.RELEASE</spring.version>
23     </properties>
24 </project>

正如你所见,Maven通过声明的方式来管理包依赖。一个本地库会被创建(默认在{user_home}/.m2 目录中),所有需要的类库会从共有库中下载下来放置到本地库中。进而在其内部 – 库依赖关系会被自动的处理和控制。

lwei

翻译于 4天前

0人顶

 翻译的不错哦!

3.添加 Quartz 依赖

在项目的pom.xml文件中添加 Quartz 依赖,下面是添加后的pom.xml文件内容

03     <modelVersion>4.0.0</modelVersion>
04     <groupId>com.javacodegeeks.snippets.enterprise</groupId>
05     <artifactId>springexample</artifactId>
06     <version>0.0.1-SNAPSHOT</version>
07  
08     <dependencies>
09         <dependency>
10             <groupId>org.springframework</groupId>
11             <artifactId>spring-core</artifactId>
12             <version>${spring.version}</version>
13         </dependency>
14  
15         <dependency>
16             <groupId>org.springframework</groupId>
17             <artifactId>spring-context</artifactId>
18             <version>${spring.version}</version>
19         </dependency>
20  
21         <dependency>
22             <groupId>org.springframework</groupId>
23             <artifactId>spring-tx</artifactId>
24             <version>3.1.2.RELEASE</version>
25         </dependency>
26  
27         <!--
这里是 Quartz 框架依赖-->
28         <dependency>
29             <groupId>org.quartz-scheduler</groupId>
30             <artifactId>quartz</artifactId>
31             <version>1.8.6</version>
32         </dependency>
33     </dependencies>
34     <properties>
35         <spring.version>3.2.3.RELEASE</spring.version>
36     </properties>
37 </project>

4. 在Spring 中使用JDK 自带的定时任务

4.1 创建一个简单的任务

下面的MyTask.java 是个简单的可以执行的任务

MyTask.java

1 package com.javacodegeeks.snippets.enterprise;
2  
3 public class MyTask
{
4     public void sayHello()
{
5         System.out.println("Hello
!!! "
);
6     }
7 }

lestchun

翻译于 4天前

0人顶

 翻译的不错哦!

4.2 在applicationContext.xml中配置Scheduler和Timer

Spring 使用自己实现的Task取代了JDK中的TimerTask,Spring的Task是可以被定时调用或者通过Timer来重复调用的,它就是org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean。它也提供了对于JDK Timer的一个实现,它是一个后台线程用来调度任务的工具类,这个类就是org.springframework.scheduling.timer.ScheduledTimerTask。

另外,还定义了一个TimerFactoryBean, 来启动计划任务的执行. 它是一个工厂Bean,它设置了一个暴露给其他bean引用的Timer. 它允许注册ScheduledTimerTask,在容器启动的时候开启Timer然后在容器销毁的时候将它取消。

需要执行计划任务的时候,我们需要做的就是在applicationContext.xml文件中定义上面所有提到过的类. 我们在myTask bean中指定MyTask.java类. 我们也需要定义schedulerBean, 它引用TimerTask类. 它有两个属性需要配置. targetObject的值引用我们自己实现的任务bean,也就是myTask. targetMethod属性的值是需要被计划执行的任务方法.

雅典娜拉

翻译于 4天前

0人顶

 翻译的不错哦!

timerTask这个bean是个Timer类型的bean。它有一个timerTask属性,我们可以通过它设置对上面定义好的名为timerTask的bean的引用。这里我们可以使用delay参数来配置第一次开始任务前的延时时间,单位是毫秒。我们也可以使用period参数来设置重复执行任务之间的间隔,单位也是毫秒。我们把它配置成每5秒钟执行一次,首次延时1秒钟。

TimerFactoryBean也定义在applicationContext.xml中。我们可以使用FactoryBean创建的Timer通过scheduledTimerTask参数,来注册一系列ScheduledTimerTask对象。这里,我们注册了定义好的timerTask。

applicationContext.xml

07  
08    
09  <bean id="myTask" class="com.javacodegeeks.snippets.enterprise.MyTask" />
10   
11  <bean id="schedulerTask"
12   class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
13     <property name="targetObject" ref="myTask" />
14     <property name="targetMethod" value="sayHello" />
15 </bean>
16  
17 <bean id="timerTask"
18     class="org.springframework.scheduling.timer.ScheduledTimerTask">
19     <property name="timerTask" ref="schedulerTask" />
20     <property name="delay" value="1000" />
21     <property name="period" value="5000" />
22 </bean>
23  
24 <bean class="org.springframework.scheduling.timer.TimerFactoryBean">
25     <property name="scheduledTimerTasks">
26         <list>
27             <ref local="timerTask" />
28         </list>
29     </property>
30 </bean>
31 </beans>

lwei

翻译于 4天前

0人顶

 翻译的不错哦!

5 Quartz调度器

5.1 Quartz调度器任务

为了使用Quartz调度器来丰富我们的例子,首先我们必须设置一个Quartzs调度器任务。可以用两种方式实现这一工作。第一种方式是在applicationContext.xml中把调度任务定义成Spring的一个bean。这个bean可以是一个org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,有两个配置参数targetObject和targetMethod,就像我们在上一步中所做的一样。不过,让我们来尝试一个更加复杂的调度器吧。我们仅需创建一个类来继承org.springframework.scheduling.quartz.QuartzJobBean,就可以实现我们自己的两个调度器。MyTask.java可以通过一个setter方法传递给调度器。随后,任务里的方法会在继承自QuartzJobBean的调度任务的executeInternal(JobExecutionContext
context)方法中被调用。

QuartzJob.java

01 package com.javacodegeeks.snippets.enterprise.quartz;
02  
03 import org.quartz.JobExecutionContext;
04 import org.quartz.JobExecutionException;
05 import org.springframework.scheduling.quartz.QuartzJobBean;
06  
07 import com.javacodegeeks.snippets.enterprise.MyTask;
08  
09 public class QuartzJob extends QuartzJobBean
{
10      
11     private MyTask
myTask;
12  
13     public void setMyTask(MyTask
myTask) {
14         this.myTask
= myTask;
15     }
16  
17     protected void executeInternal(JobExecutionContext
context)
18         throws JobExecutionException
{
19         myTask.sayHello();
20     }
21 }

lwei

翻译于 4天前

0人顶

 翻译的不错哦!

5.2 Quartz触发器

现在我们必须要来定义运行调度任务的Quartz触发器了。Quartz提供了两个类来实现触发器部分。在org.springframework.scheduling.quartz.SimpleTriggerBean中我们可以设置startTime,endTime和intervals来运行任务,而在org.springframework.scheduling.quartz.CronTriggerBean则支持UNIX的cron表达式来指定任务运行的时间。两种触发器类型都被定义成Spring的bean,而且两者都提供了一个jobDetail参数来设置对调度任务的引用。

还有一个配置工作是创建一个SchedulerFactoryBean,它可以整合调度任务和触发器。所以两个bean都被包含在SchedulerFactoryBean的定义中。

在applicationContext.xml中我们定义了所有的的bean,包括调度任务、触发器和SchedulerFactoryBean。

applicationContext.xml

07  
08    
09  <bean id="myTask" class="com.javacodegeeks.snippets.enterprise.MyTask" />
10  
11 <!--
quartz -->
12     <bean name="quartzJob" class="org.springframework.scheduling.quartz.JobDetailBean">
13         <property name="jobClass" value="com.javacodegeeks.snippets.enterprise.quartz.QuartzJob" />
14         <property name="jobDataAsMap">
15           <map>
16             <entry key="myTask" value-ref="myTask" />
17           </map>
18         </property>
19     </bean>
20      
21     <bean id="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean">
22         <property name="jobDetail" ref="quartzJob" />
23         <property name="repeatInterval" value="5000" />
24         <property name="startDelay" value="1000" />
25     </bean>
26   
27     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
28         <property name="jobDetail" ref="quartzJob" />
29         <property name="cronExpression" value="0/5
* * * * ?"
/>
30     </bean>
31   
32     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
33         <property name="jobDetails">
34             <list>
35                 <ref bean="quartzJob" />
36             </list>
37         </property>
38         <property name="triggers">
39             <list>
40                 <ref bean="cronTrigger" />
41             </list>
42         </property>
43     </bean>
44 </beans>

lwei

翻译于 4天前

0人顶

 翻译的不错哦!

注意,我们添加的两个触发器的实现,在SchedulerFactoryBean中只使用了其中一个。cronTrigger是org.springframework.scheduling.quartz.CronTriggerBean类型的实现,而simpleTrigger是org.springframework.scheduling.quartz.SimpleTriggerBean类型的实现。在SchedulerFactoryBean类型的bean的triggers参数中设置了对cronTrigger的引用,而在jobDetails参数中设置了对调度任务的引用。

需要注意的另外一件事是,名为quartzJob的bean的定义。这里通过一个参数把Quartz任务类设定为org.springframework.scheduling.quartz.JobDetailBean类。该类有一个jobDataAsMap参数,任务会在这里进行注册。

lwei

翻译于 4天前

0人顶

 翻译的不错哦!

6. 运行应用

在App.java类里,我们装载了applicationContext.xml文件并使运行应用程序的线程休眠30秒后再关闭上下文。一旦上下文被打开,任务就会像上面安排的那样开始运行。sayHello()方法每5秒钟被调用一次,两个案例都是。

App.java

01 package com.javacodegeeks.snippets.enterprise;
02  
03 import org.springframework.context.ConfigurableApplicationContext;
04 import org.springframework.context.support.ClassPathXmlApplicationContext;
05  
06 public class App
{
07  
08     public static void main(String[]
args) 
throws InterruptedException
{
09         ConfigurableApplicationContext
context = 
newClassPathXmlApplicationContext("applicationContext.xml");
10          
11         Thread.sleep(30000);
12         context.close();
13     }
14  
15 }

这是关于Spring 3 Scheduler的两个实现JDK TimerQuartz的一个例子。

可以下载该教程的Eclipse项目 : SpringSchedulerQuartzExample.zip

Spring 3 调度器示例 —— JDK 定时器和 Quartz 展示的更多相关文章

  1. Spring Boot 调度器

    Spring Boot 可以很简单的添加一个调度任务 首先需要添加maven依赖 <dependency> <groupId>org.springframework</g ...

  2. [Spring]支持注解的Spring调度器

    概述 如果想在Spring中使用任务调度功能,除了集成调度框架Quartz这种方式,也可以使用Spring自己的调度任务框架. 使用Spring的调度框架,优点是:支持注解(@Scheduler),可 ...

  3. Spring中Quartz调度器的使用

    一.Quartz的特点 * 按作业类的继承方式来分,主要有以下两种: 1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 2. ...

  4. cocos2d-x调度器原理

    程序运行后每达到一帧的时间间隔就会执行一次mainLoop void CCDisplayLinkDirector::mainLoop(void) { //判断是否需要释放CCDirector,通常游戏 ...

  5. Go调度器介绍和容易忽视的问题

    本文记录了本人对Golang调度器的理解和跟踪调度器的方法,特别是一个容易忽略的goroutine执行顺序问题,看了很多篇Golang调度器的文章都没提到这个点,分享出来一起学习,欢迎交流指正. 什么 ...

  6. python3 爬虫五大模块之一:爬虫调度器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  7. 在Spring中使用JDK定时器实现调度任务

    在Spring中使用JDK定时器实现调度任务 作者:chszs,转载需注明.博客主页: http://blog.csdn.net/chszs 本文探讨Spring如何集成JDK的Timer定时器,实现 ...

  8. Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例

    最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的 ...

  9. java定时任务以及Spring使用Quartz调度器执行定时任务

    java下的java.util.Timer中类可以实现定时执行任务的执行: 如:让任务立即执行,每隔1s循环执行一次 public class TimerClass { public static v ...

随机推荐

  1. UIView 中bounds和frame的差别

    搞iOS开发的童鞋基本都会用过UIView,那他的bounds和frame两个属性也不会陌生,那这两个有什么实质性的区别呢? 先看到下面的代码你肯定就明白了一些: -(CGRect)frame{    ...

  2. TRIZ系列-创新原理-21-高速通过原理

    高速通过原理,有的书也译为"降低有害作用的时间"原理,我比較倾向于叫高速通过原理,这个概念下,适用范围比較大些.高速通过原理的详细描写叙述例如以下:1)很高速的实施有害的或者有危急 ...

  3. c/c++中宏定义##连接符 和#符的使用

    C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏 ...

  4. (转)ios跳转到通用页面

    在代码中调用如下代码: [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:@"prefs:root=LOCATION ...

  5. NSFileManager的应用

    单例,是在 一个文件中只创建一次就能够全部一起共享,多创建的地址是相同的 NSFileManager *manager=[NSFileManager defaultManager]; 是一个单例   ...

  6. USB数据流模型

    USB数据流模型 <<USB Specification11>> << USB Specification20>> << Linux Dev ...

  7. JavaSE_ API常用对象 总目录(11~14)

    JavaSE学习总结第11天_开发工具 & API常用对象111.01 常见开发工具介绍11.02 Eclipse和MyEclipse的概述11.03 Eclipse的下载安装及卸载11.04 ...

  8. sqlserver 在将 nvarchar 值 'XXX' 转换成数据类型 int 时失败

    最近做oracle和sqlserver数据库兼容,感觉sqlserver真心没oracle好用,存储过程竟然只能返回int类型,疯了 疯了 存储过程的output及return的区别 sql取整 ce ...

  9. Correlation rule tuning

    Lots of organizations are deploying SIEM systems either to do their due diligence or because it’s pa ...

  10. Nexus 5完全拆解

    Nexus 5,由LG制造,配备高通骁龙四核处理器,4.95英寸1080P显示屏,支持4G LTE,运行最新的Android 4.4 KitKat原生操作系统.国外著名拆解网站iFixit第一时间带来 ...