Spring中实现定时调度的几种方法

网友投稿 214 2023-06-14


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();

timerhttp://.schedule(new MyTask(), 1000);//启动任务,延迟1秒后执行。

}

}

但是,如果要求要在每年的某月某时某分某秒执行某个任务,使用Timer和TimerTask就无能为力了。在项目开发中往往会有两种定时控制的选择:

quartz组件:企业及定时调度组件,需要单独配置;

SpringTask:轻量级组件,配置简单,可以利用Annotation实现配置处理。

2,Quartz定义定时调度

使用Quartz组件,我们需要导入quartz的开发包,在pom.xml中添加quartz的开发包。

org.quartz-scheduler

quartz

2.2.3

引入包后,就可以进行定时调度的开发了。

有两种实现模式:

去继承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文件中增加定时调度的配置,通过定时调度工厂类实现。

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

随后配置任务的触发作业,对于作业的配置有两类:

使用间隔触发:若干时间之后重复执行;

工厂类:org.springframework.scheduling.quartz.SimpleTriggerFactoryBean

class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">

class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">

设置间隔触发调度器:org.springframework.scheduling.quartz.SchedulerFactoryBean

3,此时所有的间隔触发控制都交由Spring管理了,现在只需要启动Spring容器即可实现间隔触发任务。

使用Cron实现定时触发

Quartz不仅可以实现间隔触发,它还可以结合Cron实现定时触发,这也是它最重要的功能。

一般项目中使用最多的模式:小时触发,月初触发,年初触发。

修改之前的间隔触发配置,使用CronTriggerFactoryBean实现定时触发。

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

启动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

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

随后在任务调度配置上配置新的程序类

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

启动容器即可实现定时调度。

这种模式没有类的继承依赖,处理会更加灵活。

Spring Task实现定时调度

在Spring中自己有对定时调度的支持,使用起来感觉比Quartz还要好用。

它有两种实现方式,1,在applicationContext.xml中配置实现;2,使用Annotation实现。

不过使用什么模式,必须先有一个任务处理类。

定义任务处理类。

这里直接使用之前的MyTask2类,不再重复写。

修改applicationContext.xml文件:

需要追加task处理的命名空间定义:

http://springframework.org/schema/task

http://springframework.org/schema/task/spring-task-4SUJzVG.1.xsd >

1配置task操作的配置,实现间隔触发。

fixed-rate="2000" />

使用cron实现定时触发

可见,SpringTask实现起来更加简单。

http://springframework.org/schema/task

http://springframework.org/schema/task/spring-task-4SUJzVG.1.xsd >

1配置task操作的配置,实现间隔触发。

fixed-rate="2000" />

使用cron实现定时触发

可见,SpringTask实现起来更加简单。

fixed-rate="2000" />

使用cron实现定时触发

可见,SpringTask实现起来更加简单。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:BootStrap框架中的data
下一篇:java定时任务Timer和TimerTask使用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~