热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

boot定时任务开启和关闭spring_Spring之定时任务实践

Java下的定时任务实现有Timer,Spring,QuartZ等,这里我们介绍Spring中定时任务的应用,其通过Sche

8e8aeca3a40fbb81bf2033ed50289e86.png

Java下的定时任务实现有Timer,Spring,QuartZ等,这里我们介绍Spring中定时任务的应用,其通过 @Scheduled 注解即可轻松实现

概述

Spring 的定时任务可以支持各种形式的定时调度任务。其通过加在定时方法上的 @Scheduled 注解来配置任务执行周期,还需要在SpringBoot1Application启动类上添加 @EnableScheduling 注解来使能定时任务(如下所示),否则定时任务将无法执行

@SpringBootApplication@EnableScheduling // 使能定时任务public class SpringBoot1Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(SpringBoot1Application.class);app.run(args);}}

@Scheduled(fixedRate = msNum )

fixedRate 指定定时任务开始调用的时间间隔(单位为ms),示例如下所示:定时任务每5s调用一次

@Componentpublic class ScheduledTaskDemo {@Scheduled(fixedRate = 5000)public void scheduledTask1() {System.out.println("Scheduled Task 1 Start: " + new Date());try{Thread.sleep(3000);} catch (Exception e) {System.out.println();}System.out.println("Scheduled Task 1 End: " + new Date());System.out.println();}}

从下图的调用结果可以看出,定时任务如我们所配置的那样,每5秒调用一次:

1fcce62eab5070e14faea7046b128a57.png

@Scheduled(fixedDelay = msNum)

fixedDelay 指定定时任务从本次调用结束到下一次开始调用的时间间隔(单位为ms),示例如下所示:

@Componentpublic class ScheduledTaskDemo {@Scheduled(fixedDelay = 5000)public void scheduledTask2() {System.out.println("Scheduled Task 1 Start: " + new Date());try {Thread.sleep(3000);} catch (Exception e) {System.out.println();}System.out.println("Scheduled Task 2 End: " + new Date());System.out.println();}}

定时任务在结束5秒后即开始下一次调用:

a2ef2bd31d743fcdb37c82355104b4aa.png

cron表达式

Spring的@Scheduled注解同时也支持cron表达式,实现更复杂的定时配置。其由6个字段组成,使用空格进行分隔

  1. : 取值范围: 0~59
  2. : 取值范围: 0~24
  3. : 取值范围: 0~23
  4. : 取值范围: 1~31
  5. : 取值范围: 1~12,JAN~DEC(大小写不敏感)
  6. 星期: 取值范围: 0~7(0为周日,1为周一,...,7为周日),SUN~SAT(大小写不敏感)

取值表示方法

  • , : 表示该字段多个有效值。即,当'秒'字段为10,30,50,表示秒为10、30、50时生效
  • init/step : init为该字段的有效初值,step为步长。即,当'秒'字段为10/20时,表示秒为10、30(10+20)、50(30+20)时生效,其等同于10,30,50
  • - : 表示该字段均有效的取值范围。即,当'月'字段为1-3,表示月为1、2、3时生效
  • * : 表示该字段的所有值均有效。即,当'月'字段为 * ,表示每个月均生效
  • ? : 表示该字段无效,只能应用在日和星期字段。由于星期字段同时使用会发生冲突,故只能使用一个生效,另一个则使用 ?

cron表达式示例:

13/30 0,3 * * * ? : 每小时的0分13秒、0分43秒、3分13秒、3分43秒 34 2 3-5 * * * ? : 每天的3点2分34秒、4点2分34秒、3点2分34秒 0 0 3 4 5 ? : 每年5月4日的3点0分0秒 0 0 3 ? * 6 : 每月周六的3点0分0秒

测试用例

@Componentpublic class ScheduledTaskDemo {@Scheduled(cron = "11/10 * 16-20 * * ?")public void scheduledTask3() {System.out.println("Scheduled Task 3 Start: " + new Date());try {Thread.sleep(3000);} catch (Exception e) {System.out.println();}System.out.println("Scheduled Task 3 End: " + new Date());System.out.println();}}

定时任务在每天的16~20点的11、21、31、41、51秒执行:

1b73cf7a01b07357826a4037fccfb175.png

与WebSocket集成问题

之前在我的项目中,已经添加WebSocket功能,然后按照上面的配置定时任务后,会启动失败,抛出如下异常:

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'defaultSockJsTaskScheduler' is expected to be of type 'org.springframework.scheduling. TaskScheduler' but was actually of type 'org.springframework.beans.factory.support.NullBean'

解决方案:

我们需要手动添加一个Scheduled的配置类来创建一个ThreadPoolTaskScheduler对象,此时项目即可成功启动

@Configurationpublic class ScheduledConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.initialize();return taskScheduler;}}



推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 大厂首发!思源笔记docker
    JVMRedisJVM面试内存模型以及分区,需要详细到每个区放什么?GC的两种判定方法GC的三种收集方法:标记清除、标记整理、复制算法的 ... [详细]
  • 一、前言2012年毕业,2016年转行,没有一个体面的工作,机缘巧合之下,来到了大连,Java培训,一个全新的领域,迷茫、困惑、漫无目的的努力,转行真的被歧视,真的不行吗?我命由我 ... [详细]
author-avatar
飘香的风中栀子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有