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. golang(5):编写WebSocket服务,client和html5调用

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1.关于websocket HTML5定义了 ...

  2. android UI进阶之用ViewPager实现欢迎引导页面[转]

    ViewPager需要android-support-v4.jar这个包的支持,来自google提供的一个附加包.大家搜下即可. ViewPager主要用来组织一组数据,并且通过左右滑动的方式来展示. ...

  3. 漫谈程序猿系列:她发现了一个Bug……

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  4. CreateFileMapping使用方法

    CreateFileMapping的MSDN翻译和使用心得   測试创建和打开文件映射的时候老是得到"句柄无效"的错误, 细致看了MSDN以后才发觉是函数认识不透, 这里把相关的解 ...

  5. Log4Net 使用总结

    在项目中要记录日志,便于程序调试.于是就想到了大名鼎鼎的Log4Net,这货可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQL Server, Access, O ...

  6. [01] Preparation - Sitecore Installment

    Sitecore CMS 是一套内容管理系统商业软件,其底层平台依托于微软.net技术.由于最近的一个项目采用了这个平台,所以有机会接触到了这个产品. 虽然接触该产品已有一段时间,但总感觉对这个产品缺 ...

  7. java读取配置文件的几种方法

    java读取配置文件的几种方法 原文地址:http://hbcui1984.iteye.com/blog/56496         在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配 ...

  8. 系统变量写在.bash_profile和.bashrc的区别

    今天配置一个代理,正儿八经的把我搞蒙了,不就是export http_porxy=xxx.xxx.xxx.xxx:xxxx 然后重启服务service network restart ,依然连接不了外 ...

  9. IntelliJ IDEA 出现Unable to execute DX 问题

    最近从eclipse转移到IDEA上写代码的时候,无意间发现一个让我头疼不已的问题,message报错为 Error:Android Dex: [**] Unable to execute DX Er ...

  10. [LeetCode]题解(python):003-Longest Substring Without Repeating Characters

    题目来源: https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题意分析: 题目是要求出最长的不 ...