Spring中实现定时调度的几种方法
作者:迈步出de围城 发布时间:2021-08-29 13:04:44
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处理的命名空间定义:
<beans 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实现起来更加简单。
来源:http://www.cnblogs.com/jjyz/p/6395781.html


猜你喜欢
- 目录1.引用Nuget包 ServiceStack.Redis2. string 类型的使用作
- 一、前言虽然jdk1.9版本已经问世,但是许多其他的配套设施并不一定支持jdk1.9版本,所以这里仅带领你配置jdk1.8。而jdk1.9的
- 1.雪崩效应 雪崩效应如上图所示,假设我们有3个微服务A,B,C,A调用B,B调用C,如果C挂掉了,由于B是同步调用,不断等待,导致资源耗尽
- 这一篇写一下springboot整合solr,代码已经上传到github,传送门。1、新建core并配置schemasolr create
- 本文实例讲述了C#实现计算一个点围绕另一个点旋转指定弧度后坐标值的方法。分享给大家供大家参考。具体如下:1.示例图P(x1,y1)以点A(a
- 一、实现对ScrollViewer样式的自定义主要包括:1、滚动条宽度设置2、滚动条颜色3、滚动条圆角4、滚动条拉动时的效果mouseove
- 通常我们在进行数据绑定的时候,常用的数据源有DataSet、DataTable、BindingList<T>、还有强类型数据源。
- 上一篇写了一下装箱拆箱的定义和IL分析,这一篇我们看下使用泛型和不使用泛型引发装箱拆箱的情况1.使用非泛型集合时引发的装箱和拆箱操作 看下面
- 2011年6月iBatis 更名为 MyBatis,从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大
- 一、lateinit延迟初始化关键字Kotlin中很多语法特性,如变量不可变,变量不可为空,等等 这些特性都是为了尽可能地保证程序安全而设计
- 1. Ajax 概述Ajax 的英文全称是 ”Asynchronous JavaScript and XML&l
- 一、背景当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢
- 这篇文章主要介绍了spring强行注入和引用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 先给大家展示下效果图,如果大家感觉不错,请参考使用方法,效果图如下所示:使用方法:录音工具类:AudioRecoderUtils.java,
- 1,什么是字符编码? 字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。一组
- IDEA 端口占用解决方法后台开发时经常遇到端口占用问题Intellij IDEA端口占用 解决方法:方法1:打开任务管理器,关闭java
- 前言Spring常见的创建bean实例的方式有:1.通过bean的class属性创建实例 无参构造器带参构造器2.工厂方法静态工厂
- 一、数组与数组元素Java中数组是引用类型数组的元素可以是基本类型也可以是引用类型,弄清数组元素的类型可以帮助我们去理解数组元素默认初始化二
- 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节
- 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参