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

发布时间 - 2026-01-10 23:02:58    点击率:

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实现起来更加简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring定时调度  # spring实现定时任务  # spring的定时调度任务  # Java中Spring使用Quartz任务调度定时器  # spring利用squertz实现定时任务  # Spring整合Quartz实现动态定时器的示例代码  # spring task 定时任务实现示例  # Spring整合TimerTask实现定时任务调度  # Spring整合Quartz实现定时任务调度的方法  # 最流行的java后台框架spring quartz定时任务  # JAVA中 Spring定时器的两种实现方式  # java中 spring 定时任务 实现代码  # 有两种  # 要在  # 每分钟  # 就可以  # 开发包  # 最多  # 是指  # 最重要  # 两种  # 要去  # 只需要  # 可以实现  # 不需  # 好用  # 它还  # 在这种情况下  # 往往会  # 可以利用  # 每隔  # 两类 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: iOS正则表达式验证手机号、邮箱、身份证号等  iOS中将个别页面强制横屏其他页面竖屏  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Android okhttputils现在进度显示实例代码  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何在服务器上三步完成建站并提升流量?  昵图网官方站入口 昵图网素材图库官网入口  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel集合Collection怎么用_Laravel集合常用函数详解  非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何在万网主机上快速搭建网站?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  香港服务器选型指南:免备案配置与高效建站方案解析  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  微信小程序 配置文件详细介绍  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  微信小程序 闭包写法详细介绍  5种Android数据存储方式汇总  如何在宝塔面板创建新站点?  EditPlus中的正则表达式实战(6)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何创建自定义Facades?(详细步骤)  Laravel如何实现用户密码重置功能?(完整流程代码)  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何在Windows 2008云服务器安全搭建网站?  Laravel如何实现模型的全局作用域?(Global Scope示例)  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何用好域名打造高点击率的自主建站?  原生JS获取元素集合的子元素宽度实例  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何快速查询网址的建站时间与历史轨迹?  phpredis提高消息队列的实时性方法(推荐)  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?