摘要: 在开发测试工具的应用后台,常常听到同事说要作个定时任务把作日志处理,或者数据清理,包括作些复杂的业务计算逻辑,在选择定时任务的时候,怎么可以快速实现,而且选择一种更适合本身的方式呢? 我这里把定时任务的实现收集整理了一些方法,但愿能够帮到刚开始作定时任务的同窗,写得不对的地方请指正。 一 java
在开发测试工具的应用后台,常常听到同事说要作个定时任务把作日志处理,或者数据清理,包括作些复杂的业务计算逻辑,在选择定时任务的时候,怎么可以快速实现,而且选择一种更适合本身的方式呢? 我这里把定时任务的实现收集整理了一些方法,但愿能够帮到刚开始作定时任务的同窗,写得不对的地方请指正。
spring
一 Java 基本的定时任务,总结方法有三种:markdown
1.1 建立一个thread,而后让它在while循环里一直运行着,经过sleep方法来达到定时任务的效果;
并发
1.2 用Timer和TimerTask与第一种方法相比有以下好处:工具
当启动和去取消任务时能够控制测试
第一次执行任务时能够指定你想要的delay时间线程
1.3 用ScheduledExecutorService是从的java.util.concurrent里,作为并发工具类被引进的,这是最理想的定时任务实现方式,相比于上两个方法,它有如下好处:3d
相比于Timer的单线程,它是经过线程池的方式来执行任务的日志
能够很灵活的去设定第一次执行任务delay时间component
提供了良好的约定,以便设定执行的时间间隔
2.1 ScheduledTimerTask: Spring的ScheduledTimerTask定义了一个定时器任务的运行周期,遗憾的是,你能够指定任务执行的频度,但你没法精确指定它什么时候运行,这就须要用到第二种Quartz进行任务调度;
建立一个业务任务,在Spring配置文件中声明 ;
在Spring 配置文件中,配置ScheduledTimerTask ,而且关联上自定义的任务实例;
启动定时器,Spring的TimerFactoryBean负责启动定时任务
2.2 使用 Quartz:
首先仍是老样子定义业务逻辑任务:
这里 Quartz的做业触发器有两种,分别是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一种SimpleTriggerBean,只支持按照必定频度调用任务,如每隔一段时间运行一次。
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="myJob" />
<property name="startDelay" value="0" /><!-- 调度工厂实例化后,通过0秒开始执行调度 -->
<property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->
</bean>
第二种CronTriggerBean,支持到指定时间运行一次,如天天12:00运行一次,如上配置;
配置调度工厂
org.springframework.scheduling.quartz.SchedulerFactoryBean,代码如上;
启动你的应用便可
2.3 使用 Spring-Task
Spring自带的定时任务工具,spring task,能够将它比做一个轻量级的Quartz,并且使用起来很简单,除spring相关的包外不须要额外的包,并且支持注解和配置文件两种:
第一步:编写任务类;TaskJob,method job1 --代码省略
第二步:在spring配置文件头中添加命名空间及描述
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
第三步:spring配置文件中设置具体的任务
<task:scheduled-tasks>
<task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/>
</task:scheduled-tasks>
<context:component-scan base-package="com.alibaba.mytask" />
说明:ref参数指定的即任务类,method指定的即须要运行的方法,cron及cronExpression表达式,具体写法这里不介绍了,<context:component-scan base-package="com.alibaba.mytask" />spring扫描注解用的。
from: https://yq.aliyun.com/articles/2368