Spring中实现定时调度
1, 内容简介
所谓的定时调度,是指在无人值守的时候系统可以在某一时刻执行某些特定的功能采用的一种机制,对于传统的开发而言,定时调度的操作分为两种形式:
定时触发:到某一时间点上执行某些处理操作;
间隔触发:每隔几秒后进行某些操作的自动处理。
所有的处理都依赖于计算机系统底层的时钟发生器,在java最初的实现过程里面,真对于定时处理专门提供有两个类:Timer,TimerTask两个类,其中TimerTask主要是定义任务的执行,相当于启动一个线程去执行某些任务。
|
public class MyTask extends TimerTask{ @Override public void run() {//定义要执行的任务 // TODO Auto-generated method stub String currentTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()); System.out.println(currentTime); } } public class MyTaskTest { public static void main(String[] args) { Timer timer=new Timer(); timer.schedule(new MyTask(), 1000);//启动任务,延迟1秒后执行。 } } |
但是,如果要求要在每年的某月某时某分某秒执行某个任务,使用Timer和TimerTask就无能为力了。在项目开发中往往会有两种定时控制的选择:
quartz组件:企业及定时调度组件,需要单独配置;
SpringTask:轻量级组件,配置简单,可以利用Annotation实现配置处理。
2,Quartz定义定时调度
使用Quartz组件,我们需要导入quartz的开发包,在pom.xml中添加quartz的开发包。
|
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> |
引入包后,就可以进行定时调度的开发了。
有两种实现模式:
去继承QuartzJobBean父类;
直接利用配置就可以实现方法的调度控制。
1,继承一个父类实现任务的处理。
|
public class MyTask2 extends QuartzJobBean{ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { // TODO Auto-generated method stub String currentTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()); System.out.println(currentTime); System.out.println("具体的任务实现!!!"); } } |
所有的定时调度的启用都要在Spring的控制文件中完成,即,不需要去写一个明确的类来进行定时任务启用。
2,在applicationContext.xml文件中增加定时调度的配置,通过定时调度工厂类实现。
|
<bean id="taskFactory" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="cn.wnh.timerSask.MyTask1" /> <property name="jobDataMap"> <map> <entry key="timeout" value="0" /> </map> </property> </bean> |
随后配置任务的触发作业,对于作业的配置有两类:
使用间隔触发:若干时间之后重复执行;
工厂类:org.springframework.scheduling.quartz.SimpleTriggerFactoryBean
|
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- 定义间隔触发的执行程序类 --> <property name="jobDetail" ref="taskFactory"></property> <!-- 设置定时触发延迟时间 --> <property name="startDelay" value="0"></property> <!-- 单位是”毫秒“ --> <property name="repeatInterval" value="2000"></property> </bean> |
设置间隔触发调度器:org.springframework.scheduling.quartz.SchedulerFactoryBean
|
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> </list> </property> </bean> |
3,此时所有的间隔触发控制都交由Spring管理了,现在只需要启动Spring容器即可实现间隔触发任务。
使用Cron实现定时触发
Quartz不仅可以实现间隔触发,它还可以结合Cron实现定时触发,这也是它最重要的功能。
一般项目中使用最多的模式:小时触发,月初触发,年初触发。
修改之前的间隔触发配置,使用CronTriggerFactoryBean实现定时触发。
|
<bean id="taskFactory" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="cn.wnh.timerSask.MyTask1" /> <property name="jobDataMap"> <map> <entry key="timeout" value="0" /> </map> </property> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="taskFactory" /> <!-- cron表达式,描述每分钟触发一次 --> <property name="cronExpression" value="0 * * * * ?" /> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> </list> </property> </bean> |
启动Spring容器即可实现。
2,不继承任何类实现定时调度
在项目开发中,继承直接会导致单继承的局限控制,所以在这种情况下Spring中提供了一种可以不继承任何类即可实现定时操作的任务处理。
定义一个任务执行类,不继承任何类。
|
public class MyTask2 { public void taskSelf(){ String task=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date()); System.out.println(task); System.out.println("执行具体任务操作"); } } |
在applicationContext.xml在配置工厂类:org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
|
<bean id="taskFactory2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="cn.wnh.timerSask.MyTask2" /> </property> <!--配置要执行的方法 --> <property name="targetMethod" value="taskSelf" /> </bean> |
随后在任务调度配置上配置新的程序类
|
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="taskFactory2" /> <!-- cron表达式,描述每分钟触发一次 --> <property name="cronExpression" value="* * * * * ?" /> </bean> |
启动容器即可实现定时调度。
这种模式没有类的继承依赖,处理会更加灵活。
Spring Task实现定时调度
在Spring中自己有对定时调度的支持,使用起来感觉比Quartz还要好用。
它有两种实现方式,1,在applicationContext.xml中配置实现;2,使用Annotation实现。
不过使用什么模式,必须先有一个任务处理类。
定义任务处理类。
|
这里直接使用之前的MyTask2类,不再重复写。 |
修改applicationContext.xml文件:
需要追加task处理的命名空间定义:
|
xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd |
1配置task操作的配置,实现间隔触发。
|
<bean id="myTask" class="cn.wnh.timerSask.MyTask2" /> <task:scheduled-tasks> <task:scheduled ref="myTask" method="taskSelf" fixed-rate="2000" /> </task:scheduled-tasks> |
使用cron实现定时触发
|
<bean id="myTask" class="cn.wnh.timerSask.MyTask2" /> <task:scheduled-tasks> <task:scheduled ref="myTask" method="taskSelf" cron="* * * * * ?" /> </task:scheduled-tasks> |
可见,SpringTask实现起来更加简单。
Spring中实现定时调度的更多相关文章
- spring中的定时调度实现TimerFactoryBean引起的隐患
手中的一个老项目,其中使用的TimerFactoryBean实现的调度任务.一般都是spring quartz实现,这种的着实少见.正因为少见资料比较少,当初为了确认这个会不会2个调度任务同时并行执行 ...
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
使用triggers和SchedulerFactoryBean来包装任务 我们已经创建了job details,jobs.我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean. 当然我们仍需要 ...
- Spring使用@Scheduled定时调度
一.spring配置文件中增加对这个注解的支持: 配置文件如下: <?xml version="1.0" encoding="UTF-8"?> &l ...
- Spring中使用Schedule调度
在spring中两种办法使用调度,以下使用是在spring4.0中. 一.基于application配置文件,配置入下: <bean id="jobDetail" class ...
- spring中的定时任务调度用例
在application-quartz.xml配置文件中添加如下配置信息: <!-- Quartz --> <bean id="getSendEmailObject ...
- JAVA中的定时调度(Timer和TimerTask)
某些时候我们需要定时去完成一些任务,这里举一个例子:我们需要在3秒钟后打印当前系统时间,此后每隔5秒重复此操作.代码如下: import java.util.TimerTask; import jav ...
- Spring使用Quartz定时调度Job无法Autowired注入Service的解决方案
1)自定义JobFactory,通过spring的AutowireCapableBeanFactory进行注入,例如: public class MyJobFactory extends org.s ...
- Java中的定时调度
Timer类是一个线程设施,用于实现在某个时间或者某一段时间后安排某个任务执行一次或者定期重复执行.需要与TimerTask配合使用. TimerTask类用来实现由Timer安排的一次或重复执行的某 ...
- Spring Quartz定时调度任务配置
applicationContext-quartz.xml定时调度任务启动代码: <?xml version="1.0" encoding="UTF-8" ...
随机推荐
- 学习笔记TF010:softmax分类
回答多选项问题,使用softmax函数,对数几率回归在多个可能不同值上的推广.函数返回值是C个分量的概率向量,每个分量对应一个输出类别概率.分量为概率,C个分量和始终为1.每个样本必须属于某个输出类别 ...
- TensorFlowSharp入门使用C#编写TensorFlow人工智能应用
TensorFlowSharp入门使用C#编写TensorFlow人工智能应用学习. TensorFlow简单介绍 TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,T ...
- unity 在安卓个IOS平台上 同一个按钮 点击后实现不同的功能
#if UNITY_IOS UIEventListener.Get(mSprites["Recharge"].gameObject).onClick = OnIOSRecharge ...
- .NET框架及C#语言基础
1.Microsoft.NET框架结构是一个面向网络,支持各种用户终端的开发平台. 2..NET框架的主要内容有CLR,FCL,ADO.NET,XML,ASP.NET,WinForms和WebSeri ...
- Linux网络原理及基础设,yum管理RPM包
一:ifconfig命令 1,ifconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址. 2. 使用ifup和ifdown命令启动和停止网卡(详见linux系统管理P42 ...
- Python教程(2.4)——字符串
2.2节讲过,Python中有字符串类型.在Python中,字符串用'或"括起,例如'abc'."qwerty"等都是字符串.注意'和"并不是字符串的内容. A ...
- Java常用类之【八种基本数据类型】
一.装箱和拆箱 装箱:将基本数据类型包装为对应的包装类对象 拆箱:将包装类对象转换成对应的基本数据类型 JDK5.0中为基本数据类型提供了自动装箱(boxing).拆箱(unboxing)功能 二.八 ...
- 高CPU、数据库无法读写的真凶
有兴趣的同学可以参考如下系列文章,都是针对dump分析的实战和总结: Windbg DUMP分析(原创汇总) http://www.cnblogs.com/LoveOfPrince/p/6653341 ...
- 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)
☆ 写在前面 之前答应大家的毕业答辩之后把所有文档贡献出来,现在答辩已过,LZ信守承诺,把所有文档开源到了GitHub(这个地址包含所有的代码和文档以及PPT,外层为简单的代码).还望喜欢的朋友们,不 ...
- JavaScript之语句,循环
JavaScript中语句主要分为三类:顺序,分支,循环. 1.顺序语句: 按照循序依次执行,最普通常见的语句,这里不多赘述. 其结构如下 2.分支语句: 根据条件判断,不同的结果执行不同的语句. 其 ...