spring 计划任务_与Spring的计划任务一起按时运行

spring 计划任务

您是否需要每天像闹钟一样在同一时间运行某个流程? 然后,Spring的预定任务适合您。 允许您使用@Scheduled注释方法,以使其在指定的时间或内部间隔运行。 在本文中,我们将研究建立一个可以使用计划任务的项目,以及如何使用不同的方法来定义它们的执行时间。

我将在本文中使用Spring Boot,以使依赖关系变得简洁而又简单,这是因为调度可用于spring-boot-starter依赖关系,该依赖关系几乎以某种方式包含在每个Spring Boot项目中。 这使您可以使用任何其他启动程序依赖项,因为它们会引入spring-boot-starter及其所有关系。 如果要包括确切的依赖项本身,请使用spring-context

您可以使用spring-boot-starter

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.0.0.RC1</version>
</dependency>

或直接使用spring-context

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.3.RELEASE</version>
</dependency>

创建计划任务非常简单。 将@Scheduled批注添加到希望自动运行的任何方法中,并将@EnableScheduling包含在配置文件中。

因此,例如,您可能会遇到类似以下的内容。

@Component
public class EventCreator {private static final Logger LOG = LoggerFactory.getLogger(EventCreator.class);private final EventRepository eventRepository;public EventCreator(final EventRepository eventRepository) {this.eventRepository = eventRepository;}@Scheduled(fixedRate = 1000)public void create() {final LocalDateTime start = LocalDateTime.now();eventRepository.save(new Event(new EventKey("An event type", start, UUID.randomUUID()), Math.random() * 1000));LOG.debug("Event created!");}
}

这里有很多代码对于运行计划任务并不重要。 正如我在一分钟前说过的,我们需要在方法上使用@Scheduled ,它将自动开始运行。 因此,在上面的示例中, create方法将每隔1000毫秒(1秒)开始运行,如注释的fixedRate属性所示。 如果我们想更改其运行频率,则可以增加或减少fixedRate时间,或者可以考虑使用可用的不同调度方法。

因此,您可能想知道其他方法是正确的吗? 好了,它们就在这里(我还将在此处包括fixedRate )。

  • fixedRatefixedRate调用之间以固定的毫秒周期执行该方法。
  • fixedRateString一样的fixedRate ,但有一个字符串值来代替。
  • fixedDelay在一次调用结束与下一次调用之间以固定的毫秒fixedDelay执行该方法。
  • fixedDelayString一样fixedDelay但一个字符串值来代替。
  • cron使用类似cron的表达式来确定何时执行该方法(我们将在稍后对此进行更深入的研究)。

@Scheduled批注还有一些其他实用程序属性。

  • zone指示将解析cron表达式的时区,如果不包括时区,它将使用服务器的默认时区。 因此,如果您需要它在特定时区运行,例如香港,则可以使用zone = "GMT+8:00"
  • initialDelay延迟第一次执行计划任务的毫秒数,需要使用固定速率或固定延迟属性之一。
  • initialDelayString同为initialDelay但一个字符串值来代替。

以下是一些使用固定速率和延迟的示例。

@Scheduled(fixedRate = 1000)

与之前相同,每1秒运行一次。

@Scheduled(fixedRateString = "1000")

同上。

@Scheduled(fixedDelay = 1000)

在上一次调用完成后运行1秒。

@Scheduled(fixedRate = 1000, initialDelay = 5000)

每秒运行一次,但要等待5秒钟才能首次执行。

现在来看一下cron属性,它可以对任务的调度进行更多控制,让我们定义任务运行的秒数,分钟数和小时数,还可以进一步定义任务的运行年限。

以下是构建cron表达式的组件的细分。

  • Seconds值可以为0-59或特殊字符, - * /
  • Minutes值可以为0-59或特殊字符, - * /
  • Hours值可以为0-59或特殊字符, - * /
  • Day of month值可以为1-31或特殊字符, - * ? / LWC , - * ? / LWC
  • Month值可以为1-12JAN-DEC或特殊字符, - * /
  • Day of week值可以是1-7SUN-SAT或特殊字符, - * ? / LC # , - * ? / LC #
  • Year可以为空,值可以为1970-2099或特殊字符, - * /

为了更加清晰起见,我将细目分类组合成一个由字段标签组成的表达式。

@Scheduled(cron = "[Seconds] [Minutes] [Hours] [Day of month] [Month] [Day of week] [Year]")

请不要在表达式中包括花括号(我用它们来使表达式更清晰)。

在我们继续之前,我们需要了解特殊字符的含义。

  • *表示所有值,因此,如果在第二个字段中使用,则表示每秒或在天字段中使用,表示每天运行。
  • ? 表示没有特定的值,并且可以在“月的天”或“星期几”字段中使用,其中使用一个会使另一个无效。 如果我们指定在一个月的15日触发,则一个? 将在“ Day of week字段中使用。
  • -表示值的范围(例如,小时数字段中的1-3表示小时数1、2和3)。
  • ,代表附加价值,例如周一,周三,SUN在本周,说明此一天,在周一,周三和周日。
  • /代表增量,例如,秒字段中的0/15从0(0、15、30和45)开始每15秒触发一次。
  • L代表一周或一个月的最后一天。 请记住,在这种情况下,星期六是一周的结束,因此在星期几字段中使用L将在星期六触发。 可以与月日字段中的数字结合使用,例如6L代表月的最后一个星期五,或者L-3这样的表达式表示月的最后一天。 如果我们在“星期几”字段中指定一个值,则必须使用? 在“日”字段中,反之亦然。
  • W表示每月的最接近的工作日。 例如,如果15W是工作日,则在每月的第15天触发,否则它将在最近的工作日运行。 该值不能用于日期值列表中。
  • #指定任务应该在星期几和星期几触发。 例如, 5#2表示该月的第二个星期四。 如果您指定的日期和星期溢出到下个月,则不会触发。

在这里可以找到有用的资源,其中的解释稍长一些,这有助于我撰写本文。

让我们来看几个例子。

@Scheduled(cron = "0 0 12 * * ?")

每天晚上12点开火。

@Scheduled(cron = "0 15 10 * * ? 2005")

2005年每天早上10:15触发。

@Scheduled(cron = "0/20 * * * * ?")

每20秒触发一次。

有关更多示例,请参见我前面提到的链接, 此处再次显示。 幸运的是,如果您在编写一个简单的cron表达式时遇到麻烦,那么您应该可以在Google中找到所需的方案,因为有人可能已经在Stack Overflow上问了相同的问题。

要将上述内容与一个小的代码示例绑定在一起,请参见下面的代码。

@Component
public class AverageMonitor {private static final Logger LOG = LoggerFactory.getLogger(AverageMonitor.class);private final EventRepository eventRepository;private final AverageRepository averageRepository;public AverageMonitor(final EventRepository eventRepository, final AverageRepository averageRepository) {this.eventRepository = eventRepository;this.averageRepository = averageRepository;}@Scheduled(cron = "0/20 * * * * ?")public void publish() {final double average =eventRepository.getAverageValueGreaterThanStartTime("An event type", LocalDateTime.now().minusSeconds(20));averageRepository.save(new Average(new AverageKey("An event type", LocalDateTime.now()), average));LOG.info("Average value is {}", average);}
}

在这里,我们有一个类,每20秒查询Cassandra以获取同一时间段内事件的平均值。 同样,这里的大多数代码都是@Scheduled批注中的噪音,但是在野外看到它可能会有所帮助。 此外,如果您一直保持观察,对于这种每20秒运行一次的用例,在这里我们使用频率如此之高,因此,使用fixedRate以及可能使用fixedDelay属性代替cron更为合适。

@Scheduled(fixedRate = 20000)

是上面使用的cron表达式的fixedRate等效项。

我前面提到的最终要求是将@EnableScheduling批注添加到配置类。

@SpringBootApplication
@EnableScheduling
public class Application {public static void main(final String args[]) {SpringApplication.run(Application.class);}
}

作为一个很小的Spring Boot应用程序,我已经将@EnableScheduling批注附加到主@SpringBootApplication类。

总而言之,我们可以安排任务使用@Scheduled注释以及执行之间的毫秒级速率或cron表达式来触发,以实现无法用前者表达的更精确的时序。 对于需要经常运行的任务,使用fixedRatefixedDelay属性就足够了,但是一旦执行之间的时间变大,则很难快速确定所定义的时间。 发生这种情况时,应使用cron属性以更好地了解计划的时间。

这篇文章中使用的少量代码可以在我的GitHub上找到 。

如果您发现这篇文章很有帮助,并希望在我撰写新教程时保持最新,请在Twitter上@LankyDanDev关注我。

翻译自: https://www.javacodegeeks.com/2018/02/running-time-springs-scheduled-tasks.html

spring 计划任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 input自动换行_直播 | 最实用的微信小程序自动化测试技术独家揭秘

随着微信小程序的功能和生态日益完善&#xff0c;很多企业级小程序项目的页面越来越多&#xff0c;业务逻辑也越来越复杂。如何做好微信小程序的自动化测试成为测试同学面临的一大难题。如何合理构建多端架构和自动化测试体系&#xff1f;如何深入理解微信小程序特性和技术原理…

sit matlab,LabView SIT工具包的使用和安装说明

之前一直在用Simulink做仿真模型&#xff0c;现在要做测试需要用NI的设备和LabView软件&#xff0c;通过一段时间的学习&#xff0c;在SIT的使用上有了点小认识拿来跟大家分享一下。需要注意的是&#xff0c;必须是先安装MatLab Simulink 然后安装SIT工具包&#xff0c;如果先安…

php cdi_CDI中的事务异常处理

php cdi在Java EE中&#xff0c;在执行事务性业务方法期间引发的异常导致事务回滚。 但是&#xff0c;只有系统异常&#xff08;即运行时异常&#xff09;才是这种情况&#xff0c;该方法异常未在方法签名中声明。 对于应用程序异常&#xff08;即检查的异常&#xff09;或任何…

opencv 把3通道图像转成单通道_小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

引入问题引入&#xff0c;考虑以下几个问题&#xff1a;Q1. 一个3通道像素p的BGR分量&#xff08;8bit表示&#xff09;值均相同&#xff0c;那么这个像素是什么颜色的&#xff1f;Q2. 该像素p加上自己&#xff0c;即&#xff0c;像素p的各个通道值翻倍&#xff0c;那么这个像素…

Linux(CentOS 7.x) 下如何设置 nginx 开机启动?

CentOS 7 以上是用 Systemd 进行系统初始化的&#xff0c;Systemd 是 Linux 系统中最新的初始化系统&#xff0c;Systemd 服务文件以 .service 结尾。 使用命令 yum 安装 nginx 如果用 yum install 命令安装 nginx&#xff0c;yum 命令会自动在目录 /usr/lib/systemd/system …

mvc 404错误 php,java - springmvc 请求无法到达controller,出现404错误

springmvc 请求无法到达controller&#xff0c;出现404错误web.xmltestmvcindex.htmlindex.htmindex.jspdefault.htmldefault.htmdefault.jspspringmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc-servlet.xml1springmvc/org.…

jdk 1.8 不可变常量_在JDK 10中不可变与不可修改

jdk 1.8 不可变常量大约两个月前&#xff0c; 斯图尔特马克斯 &#xff08; Stuart Marks&#xff09;写道&#xff1a;“ 不变性就像葡萄酒 。” 然后&#xff0c;他提醒读者注意叔本华的熵定律 &#xff1a;“如果将一勺酒倒入装满污水的桶中&#xff0c;就会产生污水。 如果…

diff算法_传统Diff算法为什么时间复杂度要O(n ^3)

原文链接&#xff1a;https://juejin.im/post/6892671384976097287很多文章提到的都是新旧DOM树需要两两对比&#xff0c;但是没有说清楚为什么。思考大家想一下&#xff0c;如果让你来设计将一棵树转换为另一棵树&#xff0c;你会怎么设计&#xff1f;可能是直接暴力的根据ind…

CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解

文章目录一、systemd 的由来&#xff08;一&#xff09;常用的 init 系统&#xff08;二&#xff09;init 程序的缺点&#xff08;三&#xff09;systemd 简介&#xff08;四&#xff09;systemd 架构图二、服务管理三、unit 配置文件&#xff08;一&#xff09;概述&#xff0…

python 指针指向的内容,python-文件的读取及指针位置

文件的读取及指针位置打开文件的三步&#xff1a;打开->操作->关闭文件的读取&#xff1a;f open(/tmp/passwd)打开f.close()操作完&#xff0c;关闭文件判断文件对象拥有的权限print(f.readable())是否拥有可读权限True or Falshprint(f.writable())是否拥有可写权限文…

jax-rs jax-ws_对状态代码使用JAX-RS异常

jax-rs jax-ws从JAX-RS资源发送特定HTTP&#xff08;错误&#xff09;状态代码的一种方法是使用javax.ws.rs.core.Response类及其类似Builder Pattern的API。 如果要根据响应主体指定返回类型&#xff0c;则仍然可以这样做&#xff0c;并通过抛出WebApplicationException针对错…

Linux 及其它类 Unix 系统的系统服务管理和控制程序(初始化系统/init system)简单梳理

文章目录一、Linux 的启动过程二、初始化程序&#xff08;一&#xff09;System V init&#xff08;二&#xff09;Upstart init&#xff08;三&#xff09;systemd&#xff08;四&#xff09;Launchd&#xff08;五&#xff09;Epoch&#xff08;六&#xff09;Mudar一、Linux…

matplotlib 柱状图_Matplotlib数据可视化:柱状图与直方图

↑↑点击上方蓝字&#xff0c;回复资料&#xff0c;嘿嘿&#xff0c;10个G的惊喜柱状图和直方图是两种非常类似的统计图&#xff0c;区别在于&#xff1a;直方图展示数据的分布&#xff0c;柱状图比较数据的大小。直方图X轴为定量数据&#xff0c;柱状图X轴为分类数据。因此&am…

php怎样完成批量审核,CMS_DedeCMS 批量取消审核文档的实现方法,今天修改了几个地方的代码 实 - phpStudy...

今天修改了几个地方的代码 实现了在原来dede文章批量管理的地方 添加一个 “取消审核” 如下图&#xff1a;实现方法&#xff1a;修改管理目录(默认为dede)下的文件&#xff1a;archives_do.php 插入以下代码(位置随意 可以放审核文档下面 方便记忆)&#xff1a;复制代码代码如…

groovy.run 脚本_Picocli 2.0:类固醇上的Groovy脚本

groovy.run 脚本Picocli 2.0增加了对其他JVM语言&#xff08;尤其是Groovy&#xff09;的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时&#xff0c;为什么还要使用picocli&#xff1f; 您可能喜欢picocli的使用帮助&#xff0c;默认情况下会显示ANSI 颜色和样式 。 您…

Linux 系统服务管理和控制程序(初始化系统/Init System) -- systemd 介绍

文章目录systemd 简介systemd 启动过程概述Systemd的争议systemd 简介 开发systemd的主要目的就是减少系统引导时间和计算开销。systemd&#xff08;系统管理守护进程&#xff09;&#xff0c;最开始以GNU GPL协议授权开发&#xff0c;现在已转为使用GNU LGPL协议&#xff0c;…

mongodb msi安装包_跟我快速学数据存储:MongoDB非关系型数据库

想要学习更多编程&#xff0c;就点上方蓝字关注我们MongoDB概述01与Redis半持久化&#xff0c;存储于内存和硬盘不同&#xff0c;MongoDB是直接持久化&#xff0c;存储于硬盘的缓存系统。MongoDB非常流行&#xff0c;其中阿里云提供了云数据库MongoDB版。https://blog.csdn.net…

php页面 info,通过PATH_INFO方法实现页面伪静态_php

/*函数url_parse用于解析url&#xff0c;使用时需要在前面定义define(PATH_INFO,true);需要解析时调用该函数&#xff0c;取值方法用回$_GET[xxx]即可*/function url_parse(){if(!(isset($_SERVER[PATH_INFO])&&defined(PATH_INFO))){return;}$url substr($_SERVER[PA…

767 重构字符串_重构字符串型系统

767 重构字符串去年&#xff0c;我加入了一个项目&#xff0c;该项目从另一个软件公司接手&#xff0c;但未能满足客户需求。 如您所知&#xff0c;在“继承”的项目及其代码库中&#xff0c;有许多事情可以并且应该加以改进。 可悲的是&#xff08;但并不奇怪&#xff09;领域…

fanuc roboguide_FANUC机器人虚拟仿真教程:Roboguide弧焊仿真工作站工装添加

Roboguide软件左侧浏览树中的“Fixture”节点专门用于添加工装资源&#xff0c;软件支持添加自带的库文件数模以及外部导入的CAD数模。软件支持CSB、DXF、STL、IGES、3DS等格式数模文件&#xff0c;一般情况下将将外部数模转换为IGES或CSB格式后进行导入效果会更好一些。本期&a…