`

spring中使用的两种任务计划

 
阅读更多
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整合quartz两种方式以及spring自带定时任务使用

    spring整合quartz两种方式以及spring自带定时任务使用

    spring 定时器的两种实现

    使用spring 实现的两种定时任务,使用eclipse直接导入就可使用

    SPRING 定时器的使用

    我们有两种选择:或者是每天由用户手动出发任务,或者让应用系统中按照预定的计划自动执行任务。 在Spring中有两种流行配置:Java的Timer类和OpenSymphony的Quartz来执行调度任务。下面以给商丘做的接口集抄900到...

    spring定时任务的两种实现

    内含配置文件与代码示例 1.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某...2.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多.

    两种方式通过spring实现定时执行任务操作

    两种方式实现定时执行任务操作,通过spring中集成的timerTask,包含源码及用到的jar包

    spring定时器两种实现方式

    spring定时器两种实现方式 ,Spring quartz java 定时器 定时任务

    spring 定时任务

    本例中一共使用了两种 spring 的定时任务,一种是使用 xml 配置的定时任务,一种是使用 annotation 配置的定时任务,其中后者的 cronExpress 表达式是配置在配置文件中的,两者的区别在于,xml是比较传统的方式,...

    Spring-task定时任务

    spring-task注解以及xml两种方式的简单使用,亲测有用

    spring定时任务

    spring定时任务,基于xml和java-config的两种配置使用方法.详细参考:http://blog.csdn.net/xiejx618/article/details/38239379

    Spring 中使用Quartz实现任务调度

    主要介绍了Spring 中使用Quartz实现任务调度,Spring中使用Quartz 有两种方式,感兴趣的小伙伴们可以参考一下。

    Spring 定时任务配置范例

    本文档详细介绍了Spring定时任务配置的两种方式。一种方式是使用Spring提供的 MethodInvokingJobDetailFactoryBean 代理类,Quartz通过该代理类直接调度任务类的某个函数,另外一种方式是任务类继承并实现Quartz接口...

    SpringMvc自动任务调度之task实现项目源码

    但如果只是简单的跑个任务其实spring... Spring Task提供两种方式进行配置,注解和配置文件。使用注解虽然简单,不用配置xml,但是相对于修改比较频繁的任务来说,打包编译的过程也是挺麻烦的,建议使用配置文件实现。

    详解Spring Boot 中实现定时任务的两种方式

    主要介绍了Spring Boot 中实现定时任务的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    batch-spring.zip

    Springbatch开启任务通常有如下两种方式,通过定时任务或者通过接口调用,定时任务使用简单,适用于数据来源稳定不需要过多外部参数干扰的情形,而接口的方式更加灵活,可以通过外部进行参数配置满足复杂的数据...

    java 中Spring task定时任务的深入理解

    在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象。这就意味着spring容许你使用其他的定时任务框架,当然spring自身也提供了...

    SpringBoot分布式任务调度,可支持rabbitmq与kafka两种消息中间件的可回滚微服务实现源代码

    本项目采用了rabbitmq与kafka两种消息队列,将任务调度从原始的业务微服务中有效分离,降低业务代码的耦合度。所有调度任务均由调度中心微服务发起。使原有业务真正实现分布式多节点运行。本资源包含了Github下载...

    spring任务调度实例

    关于spring调度的例子;| 两种方法:quartz 和 timer;| 适合学习;| 已经调试通过

    Spring3x集成Quartz2x示例工程 两种引入方式

    里面有两个定时任务, 一个是使用普通JAVA类,通过Spring使用MethodInvokingJobDetailFactoryBean注入,形式调用; 另一个是Spring使用JobDetailBean类,继承QuartzJobBean,重写 protected void executeInternal...

    spring_schedule_task_demo.rar

    spring task定时任务的demo,基于配置和基于注解两种方法实现

Global site tag (gtag.js) - Google Analytics