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

springbootschedule

很多时候,我们需要在每天的某个固定时间或者每隔一段时间让应用去执行某一个任务。为了实现这个需求,通常我们会通过多线程来实现这个功能,但是这样我们需要自己做一些比较麻烦的工作。接下来

很多时候,我们需要在每天的某个固定时间或者每隔一段时间让应用去执行某一个任务。 为了实现这个需求,通常我们会通过多线程来实现这个功能,但是这样我们需要自己做一些比较麻烦的工作。 接下来,让我们看看如何使用Spring scheduling task简化定时任务功能的实现。

默认,springboot已经支持了定时任务Schedule模块,所以一般情况已经完全能够满足我们的实际需求, 一般来说,没有必要再加入Quartz2了,不过你要是有更高级需求也可以整合Quartz2进来。

定时任务架构

一般来说,实际项目中,为了提高服务的响应能力,我们一般会通过负载均衡的方式,或者反向代理多个节点的方式来进行。 如果我们将定时任务写在我们的项目中,那么在同一个时间点,定时任务会一起执行,也就是会执行多次,这样很可能会导致我们的业务出现错误。

建议使用逻辑分离的方式来解决这个问题。就是我们将真正要定时任务处理的逻辑,写成rest或者rpc服务, 然后我们可以新建一个单独的定时任务项目,这个项目应该是没有任何的业务代码的,他纯粹只有定时任务功能, 几点启动,或者每隔多少时间启动。启动后,通过rest或者rpc的方式,调用真正处理逻辑的服务。

添加依赖

实际上只要添加最基础的start依赖即可支持定时任务:


        org.springframework.boot
        spring-boot-starter

 

添加注解配置类

如果有多个耗时任务,最好使用线程池来执行,添加一个配置类专门用来配置定时任务执行的线程池:

 1 @Configuration
 2 @EnableScheduling
 3 public class ScheduleConfig implements SchedulingConfigurer {
 4 
 5     @Override
 6     public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
 7         scheduledTaskRegistrar.setScheduler(taskExecutor());
 8     }
 9 
10     @Bean(destroyMethod="shutdown")
11     public ExecutorService taskExecutor() {
12         return Executors.newScheduledThreadPool(20);
13     }
14 }

 

添加执行任务类 

 1 @Component
 2 public class MyJob {
 3     private Logger logger = LoggerFactory.getLogger(MyJob.class);
 4     public final static long ONE_MINUTE =  10 * 1000;
 5 
 6     /**
 7      * 第一位,表示秒,取值0-59
 8      * 第二位,表示分,取值0-59
 9      * 第三位,表示小时,取值0-23
10      * 第四位,日期天/日,取值1-31
11      * 第五位,日期月份,取值1-12
12      * 第六位,星期,取值1-7,1表示星期天,2表示星期一
13      * 第七位,年份,可以留空,取值1970-2099
14      */
15     @Scheduled(cron = "0 30 12 * * ?")
16     public void checkState1() {
17         logger.info(">>>>> cron中午12:30上传检查开始....");
18         logger.info(">>>>> cron中午12:30上传检查完成....");
19     }
20 
21     @Scheduled(fixedDelay=ONE_MINUTE)
22     public void fixedDelayJob() throws InterruptedException {
23         logger.info(new Date() + " >>fixedDelay执行.... start");
24         Thread.sleep(5000L);
25     }
26 
27     @Scheduled(fixedRate=ONE_MINUTE)
28     public void fixedRateJob() throws InterruptedException {
29         logger.info(new Date() + " >>fixedRateJob执行.... start");
30         Thread.sleep(5000L);
31     }
32 }

三种定时任务类型

上面的例子中有三种典型的定时任务,先将前面最简单的两种,单位都是毫秒,比如1分钟=60秒×1000:

  1. fixedDelay:当任务执行完毕后x毫秒后再执行下一个任务
  2. fixedRate: 每隔x毫秒执行一次,不论你业务执行花费了多少时间

而还有一类定时任务,比如是每天的3点15分执行,那么我们就需要用另外一种方式:cron表达式

cron表达式

cron表达式,有专门的语法,而且感觉有点绕人,不过简单来说,大家记住一些常用的用法即可,特殊的语法可以单独去查。

cron一共有7位,但是最后一位是年,可以留空,所以我们可以写6位:

* 第一位,秒,取值0-59
* 第二位,分,取值0-59
* 第三位,时,取值0-23
* 第四位,日,取值1-31
* 第五位,月,取值1-12
* 第六位,星期,取值1-7,1表示星期天,2表示星期一
* 第七位,年份,可以留空,取值1970-2099

cron中,还有一些特殊的符号,含义如下:

 

(*)星号:可以理解为每的意思,每秒,每分,每时,每日,每月,每星期,每年...
(?)问号:问号只能出现在日和星期这两个位置,表示这个位置的值不确定,每天3点执行,所以第六位星期的位置,
我们是不需要关注的,就是不确定的值。同时:日和星期是两个相互排斥的元素,通过问号来表明不指定值。
比如,1月10日,比如是星期1,如果在星期的位置是另指定星期二,就前后冲突矛盾了。
(-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12
(,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四
(/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是0,15304560 另:*/y,等同于0/y
(L)字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
(W)字符:指定离给定日期最近的工作日(周一到周五)
(#)字符:表示该月第几个周X。6#3表示该月第3个周五

例如:

0 0 3 * * ?     每天3点执行
0 5 3 * * ?     每天3点5分执行
0 5 3 ? * *     每天3点5分执行,与上面作用相同
0 5/10 3 * * ?  每天3点的 5分,15分,25分,35分,45分,55分这几个时间点执行
0 10 3 ? * 1    每周星期天,3点10分 执行,注:1表示星期天    
0 10 3 ? * 1#3  每个月的第三个星期,星期天执行,#号只能出现在星期的位置

 


推荐阅读
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • github上_idea上传本地项目到github上(图解)
    本文由编程笔记#小编为大家整理,主要介绍了idea上传本地项目到github上(图解)相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
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社区 版权所有