用Spring Boot搭建的项目,一般来说,实际项目中,为了提高服务的响应能力,我们一般会通过负载均衡的方式,或者反向代理多个节点的方式来进行。通俗点来说,我们一般会将项目部署多实例,或者说部署多份,每个实例不同的启动端口。但是每个实例的代码其实都是一样的。如果我们将定时任务写在我们的项目中,就会面临一个麻烦,就是比如我们部署了3个实例,三个实例一启动,就会把定时任务都启动,那么在同一个时间点,定时任务会一起执行,也就是会执行3次,这样很可能会导致我们的业务出现错误。
这时,我们有几种简单的办法来处理:
1、配置文件中增加自定义配置,通过开关来进行控制:比如增加:schedule=enable , schedule=disable,这样在我们的实际代码中,在进行判断,也就是我们可以通过配置,达到,只有一个实例真正执行定时任务,其他的是实例不执行。但是,这种做法实际是还是定时任务都启动,只是在执行中,我们人工来进行判断,执行于不执行真正的处理逻辑。
2、逻辑分离,就是我们将真正要定时任务处理的逻辑,写成rest服务,或者rpc服务,然后我们可以新建一个单独的定时任务项目,这个项目应该是没有任何的业务代码的,他纯粹只有定时任务功能,几点启动,或者每隔多少时间启动,启动后,通过rest或者rpc的方式,调用真正处理逻辑的服务。同时,我们甚至可以不用新建一个项目,我们通过linux的cron就可以进行。同时,这种方式还有一个好处,比如有些时候,我们的定时任务也会因为某些原因出现问题,没有执行,那么我们就可以通过curl 或者wget等等很多方式,再次定时任务的执行。
而在spring boot中,如何使用定时任务,相对比较简单。按第二种方式,实际上,我需要新建一个项目来完成定时任务的功能,其实,我们完全可以新建一个普通的java项目,引入quartz来达到。
在spring boot的入口类Application.java中,允许支持schedule
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
然后,新建一个执行类Jobs.java
@Component public class Jobs { public final static long ONE_Minute = 60 * 1000; @Scheduled(fixedDelay=ONE_Minute) public void fixedDelayJob(){ System.out.println(Dates.format_yyyyMMddHHmmss(new Date())+" >>fixedDelay执行...."); } @Scheduled(fixedRate=ONE_Minute) public void fixedRateJob(){ System.out.println(Dates.format_yyyyMMddHHmmss(new Date())+" >>fixedRate执行...."); } @Scheduled(cron="0 15 3 * * ?") public void cronJob(){ System.out.println(Dates.format_yyyyMMddHHmmss(new Date())+" >>cron执行...."); } }
这是最简单的2种方式,多少分钟执行一次,fixedDelay和fixedRate,单位是毫秒,所以1分钟就是60秒×1000
他们的区别在于,fixedRate就是每多次分钟一次,不论你业务执行花费了多少时间。我都是1分钟执行1次,而fixedDelay是当任务执行完毕后1分钟在执行。所以根据实际业务不同,我们会选择不同的方式。
而还有一类定时任务,比如是每天的3点15分执行,那么我们就需要用另外一种方式:cron表达式。
cron一共有7位,但是最后一位是年,可以留空,所以我们可以写6位:
* 第一位,表示秒,取值0-59 * 第二位,表示分,取值0-59 * 第三位,表示小时,取值0-23 * 第四位,日期天/日,取值1-31 * 第五位,日期月份,取值1-12 * 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思 另外:1表示星期天,2表示星期一。 * 第7为,年份,可以留空,取值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,15,30,45,60 另:*/y,等同于0/y
下面列举几个例子供大家来验证:
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 每个月的第三个星期,星期天 执行,#号只能出现在星期的位置
转:http://www.jianshu.com/p/ef18af5a9c1d
相关推荐
本文将深入探讨如何在Spring Boot中实现动态配置定时任务,并实现不重启项目就能开关或重启任务以及改变任务定时规则的功能。 首先,我们需要在Spring Boot的配置文件`application.properties`或`application.yml`...
在Spring Boot应用中,定时任务是一项非常实用的功能,它允许我们按照预定的时间间隔执行特定的任务。Spring Boot提供了Spring Scheduler抽象来实现这样的需求,使得开发者能够方便地管理和控制定时任务。本篇文章将...
本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...
Spring Schedule可以通过集成Spring Boot Actuator或自定义日志输出来实现任务监控。Actuator提供了丰富的监控端点,可以查看任务的执行历史、当前状态等信息。 6. **错误处理** 当定时任务执行过程中出现异常时,...
虽然本项目没有提供前端界面,但可以在Spring Boot应用中集成Thymeleaf、Freemarker或React、Vue等前端框架,开发一个Web界面来管理定时任务。用户可以通过界面添加、修改、启动、暂停和删除任务,所有这些操作都...
(b)ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器)(c)在ScheduledFuture中有一个cancel可以...
在IT行业中,Spring Cloud Schedule是Spring Cloud框架的一个重要组件,用于构建分布式系统中的定时任务。本文将深入探讨如何使用Spring Cloud Schedule与MyBatis相结合,实现对MySQL数据库的读写操作,并设定按照...
其中,Spring的定时任务功能是许多项目中的重要组成部分,它允许开发者安排和执行周期性的任务。本文将详细探讨Spring定时任务的关键知识点,并与提供的jar包列表关联。 首先,Spring定时任务主要依赖于`spring-...
本篇文章将详细探讨如何在 Kubernetes (k8s) 集群环境中,结合 Spring Boot 应用程序和 Kubernetes CronJob 资源来配置定时任务。 首先,Spring Boot 是一个流行的 Java 框架,用于快速构建微服务应用。它提供了...
在本项目中,我们主要探讨了四个核心主题:Spring Boot与MyBatis的整合、MyBatis中的枚举转换器、前后端分离项目的统一JSON返回格式以及Spring Boot集成Quartz框架来实现定时任务。让我们逐一深入这些关键知识点。 ...
在实际项目中,"spring boot schedule swagger"组合可以用来创建定时执行的数据同步、报表生成、系统监控等功能,并通过Swagger展示这些API的接口文档,方便其他开发者理解和使用。 总结,Spring Boot Schedule...
这个"springboot-scheduler定时任务学习demo源码"提供了一个实践示例,帮助开发者深入理解如何在Spring Boot项目中配置和使用定时任务。 首先,让我们了解Spring Boot的定时任务(Scheduler)是如何工作的。在...
本项目名为“schedule-job”,是基于Spring Boot框架与Quartz库构建的分布式任务调度系统,它允许开发者方便地定义、管理和执行定时任务。 【Spring Boot基础知识】 Spring Boot是由Pivotal团队提供的全新框架,其...
Spring Boot 中使用 @Scheduled 创建定时任务 Spring Boot 框架为我们提供了多种方式来创建定时任务,其中一种方式是使用 @Scheduled 注解。@Scheduled 是 Spring Framework 中的一种注解,用于标记需要定时执行的...
在实际项目中,可能还需要考虑任务的异常处理、任务状态监控、任务的暂停与恢复、任务删除等功能。Spring Boot与Quartz的结合,使得这一切变得十分方便,极大地提高了开发效率。通过上述步骤,你已经掌握了在Spring ...
Spring Boot Schedule 定时任务不执行的问题解决方案 Spring Boot 中的定时任务是使用 @Scheduled 注解实现的,该注解可以将方法设置为定时执行。但是,如果定时任务非常多或者有的任务很耗时,会影响到其他定时...
在Spring Boot应用中,可以通过以下配置启动定时任务: ```yaml spring: task: scheduling: enabled: true ``` 接下来,你需要创建一个`@Component`注解的类,该类包含一个或多个带有`@Scheduled`注解的方法。...
5. **监控与管理**:为了更好地管理和监控定时任务,可以利用Quartz提供的JMX支持,或者使用第三方的监控工具,如Spring Boot Actuator,实时查看任务状态和执行情况。 6. **心得分享**:在实践中,要注意任务的...
在Spring Boot应用中,我们可以利用其提供的功能来配置和管理定时任务、线程池以及多线程池执行。这些配置对于构建高效、可扩展的应用至关重要,尤其是在处理并发和定时任务调度时。 首先,我们来看看如何配置基础...
本文将深入探讨如何在Tomcat中实现定时任务,主要涉及的知识点包括Java的定时器(Timer)和Spring框架的TaskScheduler。 首先,让我们了解一下Java中的定时任务。在Java标准库中,有一个名为`java.util.Timer`的类...