理解spring任务调度timer,Quartz,spring task
2017-07-17 16:14
441 查看
1.timer
指调用java.util.timer类来调用一个java.util.TimerTask的任务来实现每隔多长时间运行一次。
spring-context中集成了timer调用所需的类,所以只需要拿来使用即可。
下面是具体的做法:
<1>定义基础类Timetest,里面的run方法,就是你要定时执行的操作。
<2>在spring-application.xml配置:
ScheduledTimerTask:说明任务调度的具体配置,例如隔多长时间执行一次,延迟多久开始,及执行哪个bean中的run()方法。
然后启动你的项目,run()方法便会执行。
注意:TimerFactoryBean,ScheduledTimerTask所对应的类在spring-context.jar包中,我用4.1.6.RELEASE版本,一直报找不到该类的错误,因此降低版本至3,下面是pom.xml:
2.spring中集成Quartz
主要有两种方式:
<1>具体执行的job类继承QuartzJobBean
1.1具体执行的job类
2.spring-application.xml的配置文件
说明:
JobDetailBean:具体的任务执行程序,主要指定具体调用哪个job任务。
simpleTrigger:触发器,主要配置调度参数,例如隔多长时间执行
SchedulerFactoryBean: 生成Scheduler调度容器。
<2>job类为普通java类方式
(1)job类
(2)spring-application.xml
3.spring-task的应用
<1>配置文件的方式实现:
spring-application.xml中添加:
普通job类:
几种方式的对比
对于java.util.timer:
缺点:
<1>其采用单线程来处理所有的任务,若一个任务所用的时间比较长,那么后面的任务一直不能执行。
<2>若在运行过程中发生异常,则线程会终止执行,这使得后面的任务都不能执行。
改进:运行Executor的scheduleExecutor来实现线程池中多线程处理任务。
scheduleExecutor缺点:不能处理复杂任务,例如规定执行的时间为:除过周末和节假日的中午12:00
改进:引入Quart框架
缺点:Quartz是一个重量级框架,使用起来不方便。
引入:spring3.0以后引入 spring-task
指调用java.util.timer类来调用一个java.util.TimerTask的任务来实现每隔多长时间运行一次。
spring-context中集成了timer调用所需的类,所以只需要拿来使用即可。
下面是具体的做法:
<1>定义基础类Timetest,里面的run方法,就是你要定时执行的操作。
public class Timetest extends TimerTask { public void run(){ System.out.println("数据库执行了两次"); } }
<2>在spring-application.xml配置:
<!-- 使用timer实现任务调度 --> <bean id="scheduledTimerTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask" ref="timetest" /> <!-- 每隔一天执行一次配置: 24*60*60*1000 --> <!-- 每1秒钟程序执行一次 --> <property name="period" value="3000" /> <!-- 程序启动4秒钟后开始执行 --> <property name="delay" value="4000" /> </bean> <bean id="timerFactoryBean" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"> <list> <ref bean="scheduledTimerTask" /> </list> </property> </bean> <bean id="timetest" class="com.tc.tccp.core.util.Timetest"> </bean>
ScheduledTimerTask:说明任务调度的具体配置,例如隔多长时间执行一次,延迟多久开始,及执行哪个bean中的run()方法。
然后启动你的项目,run()方法便会执行。
注意:TimerFactoryBean,ScheduledTimerTask所对应的类在spring-context.jar包中,我用4.1.6.RELEASE版本,一直报找不到该类的错误,因此降低版本至3,下面是pom.xml:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.18.RELEASE</version> </dependency>
2.spring中集成Quartz
主要有两种方式:
<1>具体执行的job类继承QuartzJobBean
1.1具体执行的job类
package com.tc.tccp.core.util; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; /** * @author wangpei * @version 创建时间:2017年7月17日 下午1:18:47 类说明 */ public class Jobtest extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { System.out.println("操作数据库"); } }
2.spring-application.xml的配置文件
<bean name="Jobtest" class="org.springframework.scheduling.quartz .JobDetailBean"> <property name="jobClass" value="com.tc.tccp.core.util.Jobtest" /> </bean> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz .SimpleTriggerBean"> <property name="jobDetail" ref="Jobtest" /> <property name="startDelay" value="0" /> <property name="repeatInterval" value="2000" /> </bean> <bean class="org.springframework.scheduling.quartz .SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> </list> </property> </bean>
说明:
JobDetailBean:具体的任务执行程序,主要指定具体调用哪个job任务。
simpleTrigger:触发器,主要配置调度参数,例如隔多长时间执行
SchedulerFactoryBean: 生成Scheduler调度容器。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context- support</artifactId> <version>3.2.18.RELEASE</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.5</version> </dependency>
**结果**:每个2s输出操作数据库
<2>job类为普通java类方式
(1)job类
package com.tc.tccp.core.util; /** * @author wangpei * @version 创建时间:2017年7月18日 下午5:18:11 * 类说明 */ public class Job2test { public void executeMethod(){ System.out.println("数据库执行的第三种方式"); } }
(2)spring-application.xml
<!-- Quartz普通java类的方式 --> <bean id="Job2test" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="com.tc.tccp.core.util.Job2test" /> </property> <property name="targetMethod" value="executeMethod" /> <property name="concurrent" value="false" /> </bean> <bean id="simpleTrigger2" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="Job2test" /> <property name="startDelay" value="0" /> <property name="repeatInterval" value="5000" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger2" /> </list> </property> </bean>
3.spring-task的应用
<1>配置文件的方式实现:
spring-application.xml中添加:
<task:scheduled-tasks> <task:scheduled ref="tasktest1" method="execute" cron="*/5 * * * * ?" /> </task:scheduled-tasks> <bean id="tasktest1" class="com.tc.tccp.core.util.Tasktest"> </bean>
普通job类:
package com.tc.tccp.core.util; /** * @author wangpei * @version 创建时间:2017年7月18日 下午5:35:55 类说明 */ public class Tasktest { public void execute() { System.out.println("这是task方式的第一种方法"); } }
几种方式的对比
对于java.util.timer:
缺点:
<1>其采用单线程来处理所有的任务,若一个任务所用的时间比较长,那么后面的任务一直不能执行。
<2>若在运行过程中发生异常,则线程会终止执行,这使得后面的任务都不能执行。
改进:运行Executor的scheduleExecutor来实现线程池中多线程处理任务。
scheduleExecutor缺点:不能处理复杂任务,例如规定执行的时间为:除过周末和节假日的中午12:00
改进:引入Quart框架
缺点:Quartz是一个重量级框架,使用起来不方便。
引入:spring3.0以后引入 spring-task
相关文章推荐
- spring+quartz定时器任务调度(时间配置比timer灵活的多)
- spring(基础五) spring实现后台的任务调度TimerTask和Quartz
- Spring实现后台的任务调度TimerTask和Quartz
- spring实现自动定时任务调度【Spring Task】【Quartz】
- Spring整合quartz实现任务调度
- Spring与Quartz的整合实现定时任务调度 以及crontab的用法
- 在Spring中使用Quartz进行任务调度(4)
- Spring整合TimerTask实现定时任务调度
- quartz结合spring轻松实现任务调度
- java定时任务调度工具Timer和Quartz
- JavaSpring使用Quartz任务调度定时器
- Spring整合Quartz实现定时任务调度
- spring学习笔记spring整合Quartz持久化稳健任务调度(2)
- spring 任务调度框架Quartz
- [springboot]集成org.quartz-scheduler进行任务调度
- Spring配置Quartz实现定时调度任务
- Quartz 集成Spring实现简单的任务调度Demo
- Spring与Quartz的整合实现定时任务调度
- Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
- Spring+Quartz 整合二:调度管理与定时任务分离