spring中使用的两种任务计划
[1]
spring中使用的两种任务计划,分别是:
ScheduledTimerTask: 只能指定任务与任务之间的周期,而无法指定某个特定的时间内执行某项任务.
Quartz: 推荐使用Quartz来解决这样的问题。
[2]
ScheduledTimerTask的用法:
分为继承与不继承java.util.TimerTask.
其过程如下:
1.写任务类(timerTask);
2.(非继承用timerTaskBean);
3.设置任务的schedule(scheduledTimerTask)
4.放置到任务工厂中(timerFactoryBean)
(1)
继承TimerTask用法:
写任务类:
package com.laoer.bbscs.service.task;
import java.util.Date;
import java.util.TimerTask;
public class JasonTimerTask extends TimerTask{
public void run()
{
System.out.println("JasonTimerTask1 start.the now time is:"+new Date());
}
}
设置任务的schedule且放入任务工厂:
<!--定义定时任务类-->
<bean id="jasonTimerTask" class="com.laoer.bbscs.service.task.JasonTimerTask" />
<bean id="indexScheduledTimerTask"
class="org.springframework.scheduling.timer.ScheduledTimerTask" >
<!--这里定义每20秒钟程序执行一次-->
<property name="period">
<value>20000</value>
</property>
<!--这里定义程序启动5秒钟后开始执行-->
<property name="delay">
<value>5000</value>
</property>
<!--这里定义定时任务的对象的位置-->
<property name="timerTask">
<ref local="jasonTimerTask"/>
</property>
</bean>
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" >
<property name="scheduledTimerTasks">
<list>
<ref local="indexScheduledTimerTask"/>
<ref local="jasonHelloScheduledTimerTask"/>
</list>
</property>
</bean>
(2)
不继承TimerTask用法:
1.
写任务类:
package com.laoer.bbscs.service.task;
import java.util.Date;
public class JasonHelloTimerTask {
public void execute()
{
System.out.println("JasonTimerTask2 start. Welcome to here !");
}
}
不同的地方:
不用继承TimerTask,且方法可以自定义,不须用run();
2.
设置timerTaskBean:
<bean id="timerTaskBean"
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject">
<ref local="jasonHelloTimerTask"/>
</property>
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
3.
设置任务的schedule且放入任务工厂:
<bean id="jasonHelloScheduledTimerTask"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="period">
<value>10000</value>
</property>
<property name="delay">
<value>3000</value>
</property>
<property name="timerTask">
<ref local="timerTaskBean"/>
</property>
</bean>
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" >
<property name="scheduledTimerTasks">
<list>
<ref local="indexScheduledTimerTask"/>
<ref local="jasonHelloScheduledTimerTask"/>
</list>
</property>
</bean>
[3]
Quartz的用法:
Spring 则对Quartz 进行了封装,在使用上更加方便。
也分为继承与不继承QuartzJobBean.
其过程如下:
1.写任务类(jobDetailBean);
2.(非继承用MethodInvokingJobDetailFactoryBean);
3.设置任务的schedule(cronTriggerBean)
4.放置到任务工厂中(schedulerFactoryBean)
"cronExpression" 属性的分析:
指定的格式是至少六个时间元素,最多七个时间元素,例如上面的指定是每天的19 时要执行Job 一次,
"cronExpression" 属性指定的格式如下:
u 秒(0-59)
u 分(0-59)
u 小时(0-23)
u 每月第几天(1-31)
u 月(1-12 或JAN-DEC)
u 每星期第几天(1-7 或SUN-SAT)
u 年(1970-2099)
其中“每月第几天”与“每星期第几天”是互斥的,两个只能设定一个,不设定的以“?”符号编写,如果有好几个时间点,可以使用“,”符号,例如:“0 0 10,12,14 * * ? ”表示每天的10 时、12 时、14 时要执行Job;对于连续的时间可以使用 -符号,例如“0 0 10,12,14 1-15 * ? ”表示每月的1 到15 日每10 时、12 时、14 时要执行Job,时间格式中的年指定可有可无,例如:“0 0 10,12,14 ? * MON 2006 ”表示2006 年每星期一的10 时、12 时、14 时要执行Job。
(1)
继承Quartz:
任务类:
package com.laoer.bbscs.service.scheduling;
public class JasonGetPersonJob extends QuartzJobBean{
private PersonService personService;
public PersonService getPersonService() {
return personService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
public void executeInternal(JobExecutionContext arg0)
{
PersonInfo personInfo=this.getPersonService().queryPersonInfoByName
("jason");
System.out.println("jason 定时执行的job.获取personInfo表中jason用户的密码是
: "+personInfo.getPassword());
}
}
2.
定义任务类:
<bean id="jasonGetPersonJobDetailBean"
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.laoer.bbscs.service.scheduling.JasonGetPersonJob</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="personService">
<ref bean="personService"/>
</entry>
<!-- 若有多个继续写下去 -->
</map>
</property>
</bean>
3.
设置定点执行:
<bean id="jasonGetPersonCronTriggerBean"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jasonGetPersonJobDetailBean"/>
</property>
<property name="cronExpression">
<value>30 * * * * ?</value>
</property>
</bean>
4.
放入工厂中:
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
<ref bean="jasonGetPersonCronTriggerBean"/>
</list>
</property>
</bean>
(2)
不继承Quartz:
1.
写任务类:
public class JasonTestJob {
public void execute()
{
System.out.println("jason 定时执行的job. 每分钟的第30秒执行一次.
Test......... !");
}
}
2.
定义任务类:
<bean id="jasonTestJob" class="com.laoer.bbscs.service.scheduling.JasonTestJob"/>
<bean id="testJobDetailBean"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="jasonTestJob"/>
</property>
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
3.
设置定时执行
<bean id="cronTriggerBean"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--这里定义定时任务的对象的位置-->
<property name="jobDetail">
<ref bean="testJobDetailBean"/>
</property>
<!--这里定义每分钟第30秒的时候程序执行一次-->
<property name="cronExpression">
<value>30 * * * * ?</value>
</property>
</bean>
4.
放入工厂:
<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
<ref bean="jasonGetPersonCronTriggerBean"/>
</list>
</property>
</bean>
[4]
以上所有方法的部分输出如下:
JasonTimerTask1 start.the now time is:Thu Jun 04 15:01:18 CST 2009
JasonTimerTask2 start. Welcome to here !
jason 定时执行的job. 每分钟的第30秒执行一次. Test......... !
jason 定时执行的job.获取personInfo表中jason用户的密码是: 1234
JasonTimerTask2 start. Welcome to here !
JasonTimerTask1 start.the now time is:Thu Jun 04 15:01:38 CST 2009
JasonTimerTask2 start. Welcome to here !
JasonTimerTask2 start. Welcome to here !
JasonTimerTask1 start.the now time is:Thu Jun 04 15:01:58 CST 2009
JasonTimerTask2 start. Welcome to here !
JasonTimerTask2 start. Welcome to here !
JasonTimerTask1 start.the now time is:Thu Jun 04 15:02:18 CST 2009
[5]
使用总结:
(1)
ScheduledTimerTask与Quartz的创建过程是相同的.
1.创建任务类(分继承与不继承两种方式)
2.创建时间表类
3.放入任务工厂
(2)
ScheduledTimerTask与Quartz何时使用继承与不继承:
一般情况下,若一开始创建定时功能时,可以自由选择两种方式,都可;
若对原系统的方法添加定时功能,这时,用非继承的方法比较方便(只须指定系统类与其定时执行的方法).
(3)
如何整合ScheduledTimerTask与Quartz到系统中(即让系统现有功能添加定时执行功能):
1.整合ScheduledTimerTask与Quartz到系统中去,是采用非继承的方式.
2.只须指定要执行的系统类与其定时执行的方法即可.
具体请看: "ActiveMQ+JMS笔记"中的一实例.
分享到:
相关推荐
首先,Spring提供了两种主要的定时任务实现:`Spring Task`(也称为Spring自己的任务调度器)和`Quartz Scheduler`。`Spring Task`相对简单,适用于轻量级的定时需求,而`Quartz`则功能强大,适合复杂的调度场景。 ...
在本文中,我们将探讨Spring与Quartz的两种整合方式以及Spring自身提供的定时任务功能。 ### Spring整合Quartz的方式 #### 1. 配置驱动的方式 这种方式主要是通过XML配置来创建和管理Quartz的Scheduler实例。首先...
在Spring框架中,有两种主要的方法来实现定时任务:Spring自带的`@Scheduled`注解和引入第三方库Quartz。这两种方法都可以帮助开发者在特定的时间点执行任务,为应用程序添加计划任务的能力。 首先,我们来看看使用...
标题"Spring 任务调度"涵盖了Spring框架中的两个主要组件:Spring Task和Quartz Scheduler。Spring Task是Spring内置的轻量级任务调度器,而Quartz是更强大的第三方调度库,可以在Spring中集成使用。 1. **Spring ...
在描述中提到的博文链接可能提供了关于如何在Spring中使用这两种方法的详细教程,包括配置、任务定义以及触发策略等。通常,这样的教程会涵盖以下几个方面: - 如何配置Spring的TaskExecutor或TaskScheduler - 如何...
本文将详细讲解两种通过Spring实现定时任务的方法:Spring的`TimerTask`和`Spring Batch`的`Tasklet`。我们将涵盖这两种方法的基本原理、配置以及使用源码,确保你能全面理解如何在实际项目中应用。 ### 一、Spring...
首先,Spring提供了两种主要的任务调度机制:Spring内置的`TaskExecution`和`TaskScheduling`以及与Quartz Scheduler的集成。`TaskExecution`和`TaskScheduling`是Spring框架的基础任务调度API,它们允许开发者创建...
在Spring框架中,邮件服务和定时任务是两个非常重要的功能扩展。邮件服务允许开发者向用户发送电子邮件,而定时任务则可以实现程序的自动化执行,如数据同步、报表生成等。以下将详细介绍这两个方面。 首先,我们来...
在IT领域,尤其是在Java开发中,定时任务是一个非常常见的需求,用于执行周期性的任务,比如数据备份、报表生成、...结合提供的文档和源码工程,读者可以深入理解并实践这两种定时任务的实现方式,提升自己的技能水平。
在这两种方式中,Spring框架提供了自己的定时任务工具Spring Task,以及与专业定时任务框架Quartz集成的能力。 首先,对于Java自带的定时任务实现,我们可以使用java.util.Timer和java.util.TimerTask类。Timer类...
Spring的定时任务可以通过两种方式实现:基于注解和基于XML配置。 1. **基于注解的定时任务**: 使用`@Scheduled`注解可以在类或方法级别声明定时任务。例如: ```java @Component @EnableScheduling public ...
下面我们将深入探讨Spring的自带定时任务,包括基于注解和XML配置两种方式。 ### 1. Spring定时任务基础 Spring的定时任务功能是通过`org.springframework.scheduling`包中的类来实现的,主要涉及`TaskScheduler`...
在Spring中使用Quartz,可以更好地整合到Spring的管理环境中。 在示例中,定义了一个`SayHelloTaskUsingQuartz`类,继承自`QuartzJobBean`。`executeInternal()`方法是Quartz任务的核心,用于定义具体的工作逻辑。...
Spring Task提供了两种主要的方式来创建定时任务:`@Scheduled`注解和`TaskScheduler`接口。`@Scheduled`注解可以用于方法上,用于声明一个定时任务,而`TaskScheduler`接口则允许自定义任务调度逻辑。 ```java // ...
接下来,我们将详细介绍Quartz和Spring Task两种实现方式的具体使用方法。 ##### 1. 使用Quartz Quartz是一种功能全面且强大的任务调度库。下面通过一个示例介绍如何使用Quartz。 - **作业类继承自特定的基类**:...
它提供了基于`@Scheduled`注解和`TaskScheduler`接口的两种定时任务实现方式。`@Scheduled`适用于简单的定时任务,而`TaskScheduler`则更灵活,可以用于复杂的调度需求。 二、@Scheduled注解使用 1. 配置启用定时...
内含配置文件与代码示例 1.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某...2.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多.
- `spring-beans`: 定义了Spring Bean的生命周期和配置,为定时任务中的对象创建提供支持。 - `spring-core`: Spring框架的基础,包含核心工具类和支持。 - `spring-expression`: SpEL(Spring Expression ...
下面我们将深入探讨这两种任务调度器及其在Spring中的使用。 首先,我们来看`Spring Timer`。`Spring Timer`是Spring框架提供的一个简单任务调度工具,它基于Java的`java.util.Timer`类。通过`@Scheduled`注解,...