环境:springboot2.2.11.RELEASE

2种方式执行定时任务

1、通过springboot的方式

2、使用Quartz实现定时任务


方式一:通过springboot的定时任务

1、开启定时任务功能@EnableScheduling

@SpringBootApplication@EnableSchedulingpublic class SpringBootQuartzSchedulerApplication {public static void main(String[] args) {SpringApplication.run(SpringBootQuartzSchedulerApplication.class, args);}}

2、编写定时执行的任务@Scheduled

@Componentpublic class JobExecutor {  // 每3秒执行@Scheduled(fixedDelay = 3000)public void process() {System.out.println("执行任务") ;}}

@Scheduled注解的属性说明:

fixedDelay:在上一次调用结束和下一次调用开始之间以毫秒为单位的固定时间段执行。

fixedRate:在调用之间以毫秒为单位执行任务。

initialDelay:延迟指定的毫秒数。

cron:cron表达式。

在这里@Scheduled(cron = "0/2 * * * * ?") 这里的表达式还可以通过配置的方式进行:

@Scheduled(cron = "${custom.cron}")

server:  port: 8080---custom:  cron: 0/3 * * * * ?

Cron表达式说明:

cron一定有七位数,最后一位是年,SpringBoot定时方案只需要设置六位即可:

  • 第一位, 表示秒, 取值是0 ~ 59
  • 第二位, 表示分. 取值是0 ~ 59
  • 第三位, 表示小时, 取值是0 ~ 23
  • 第四位, 表示天/日, 取值是0 ~ 31
  • 第五位, 表示月份, 取值是1 ~ 12
  • 第六位, 表示星期, 取值是1 ~ 7, 星期一,星期二..., 还有 1 表示星期日
  • 第七位, 年份, 可以留空, 取值是1970 ~ 2099

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

  • (*) 星号,可以理解为每的意思,每秒、每分、每天、每月、每年...。
  • (?)问号,问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天 3 点执行,因此第六位星期的位置,是不需要关注的,就是不确定的值;同时,日期和星期是两个相互排斥的元素,通过问号来表明不指定值,比如 1 月 10 日是星期一,如果在星期的位置另指定星期二,就前后冲突矛盾了。
  • (-)减号,表达一个范围,如在小时字段中使用“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:每个月的第三个星期,星期天执行,# 号只能出现在星期的位置。

springboot自定的定时任务使用非常简单,通过以上简单的方式执行。


方式二:通过Quartz执行定时任务

先了解Quartz的核心类:

Quartz有四个核心概念:

  • Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所需要定时执行的 Job(任务),JobExecutionContext 类提供了调度应用的一些信息;Job 运行时的信息保存在 JobDataMap 实例中,通过JobDataMap 我们可以为任务传参数。
  • JobDetail:Quartz 每次调度 Job 时,都重新创建一个 Job 实例,因此它不接受一个 Job 的实例,相反它接收一个 Job 实现类(JobDetail,描述 Job 的实现类及其他相关的静态信息,如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 Job。
  • trigger:是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的 15:00 ~ 16:00 执行调度等。
  • Scheduler:调度器就相当于一个容器,装载着任务和触发器,该类是一个接口,代表一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。

Job 为作业的接口,为任务调度的对象;JobDetail 用来描述 Job 的实现类及其他相关的静态信息;Trigger 作为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器;Scheduler 作为定时任务容器,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger。

1、添加依赖

org.springframework.bootspring-boot-starter-quartz

2、配置任务Job,JobDetail,Trigger

@Configurationpublic class QuartzConfig {@Beanpublic JobDetail sampleJobDetail() {JobDataMap dataMap = new JobDataMap() ;dataMap.put("k1", "v1") ;return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")                .usingJobData("key","pack").usingJobData(dataMap).storeDurably().build() ;}/** * 一个简单的触发器:每隔两秒执行一次(一直重复) * @return */@Bean    public Trigger sampleJobTrigger(){        SimpleScheduleBuilder scheduleBuilder =                SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever();        return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("sampleTrigger")                .withSchedule(scheduleBuilder).build();    }  }

任务:

public class SampleJob extends QuartzJobBean {private static final Logger logger = LoggerFactory.getLogger(SampleJob.class) ;@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {logger.info("这里是一个简单的任务") ;JobDataMap dataMap = context.getJobDetail().getJobDataMap() ;Set> entrys = dataMap.entrySet() ;for (Iterator> iterator = entrys.iterator(); iterator.hasNext();) {Entry entry = iterator.next();logger.info("任务数据:key = {}, value = {}", entry.getKey(), entry.getValue()) ;}}}

启动服务:

执行任务也非常简单,接下来通过cron表达式的方式配置触发器:

@Bean public Trigger cronJobTrigger() {CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?") ;return TriggerBuilder.newTrigger().forJob(sampleJobDetail()).withIdentity("t1", "CRON").withSchedule(scheduleBuilder).build() ;}

完毕!!!

给个关注,转发吧,谢谢

Spring MVC 异步请求方式

Spring MVC 异常处理方式

Spring Cloud Sentinel整合Feign

SpringCloud Nacos 整合feign

SpringMVC参数统一验证方法

Springboot Security 基础应用 (1)

SpringBoot中使用Cache及JSR107的使用

SpringBoot RabbitMQ消息可靠发送与接收

Springboot之Actuator详解

Springboot接口幂等性基于token实现方案

oracle trigger 延迟执行_springboot中定时任务执行Quartz的使用相关推荐

  1. 毫秒级精度计划任务管理、系统运维管理、定时执行任务、定时任务执行、任务定时执行软件 —— 定时执行专家

    目录 一.使用教程 1.软件下载 2.软件的安装方法 3.软件第一次运行,选择界面语言 4.设置软件开机启动,自动运行.自动隐藏(自动隐身运行) 二.软件简介 1.支持 23 种任务类型 2.支持 1 ...

  2. php怎么异步执行,php中异步执行的四种方式

    一.使用Ajax 与 img 标记 原理:服务器返回的html中插入Ajax 代码或 img 标记,img的src为需要执行的程序. 优点:实现简单,服务端无需执行任何调用. 缺点:在执行期间,浏览器 ...

  3. oracle trigger 延迟执行_一文详解Spring任务执行和调度

    一.概述 Spring框架分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象.Spring还提供了这些接口的实现,这些接口支持线程池或将其委托给应用服务器环境 ...

  4. php定时执行任务没有执行,linux中定时任务crontab中的php任务无法执行,求可能的原因...

    等待被执行的test.php脚本,该脚本在本地环境可以执行,在linux上手动执行php test.php也可以执行 $name='./log/20161025.txt'; if(file_exist ...

  5. python脚本自动运行失败_Linux中定时任务执行python脚本失败的解决方法

    原博文 2019-03-25 01:48 − 因工作需要,需要在服务器中写一个定时任务,定时把redis数据库中的数据查询出来存放在mysql数据库中,奈何没写过shell脚本,只能用python代替 ...

  6. 定时任务每秒执行、每分钟执行、每小时执行、每天执行、每周执行、每月执行、每年执行、定时任务重复执行、循环执行

    在平时生活.系统运维.实验室.学校等场景下,有很多定期循环执行任务的需求.比如:在系统运维过程中,常常会在每天凌晨1点以后执行某些批处理脚本:在实验室做实验过程中,需要每隔10分钟去操作一下设备等等. ...

  7. SpringBoot中定时任务与异步定时任务的实现

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...

  8. Oracle定时任务执行存储过程备份日志记录表

    写在前面 需求 1.备份系统日志表T_S_LOG, 按照操作时间字段OPERATETIME, 将每天的日志增量备份到另一张表. 思路 1.创建一张数据结构完全相同的表T_S_LOG_BAK作为备份表 ...

  9. oracle数据库延迟执行,如何诊断oracle数据库运行缓慢或hang住的问题

    为了诊断oracle运行缓慢的问题首先要决定收集哪些诊断信息,可以采取下面的诊断方法: 1.数据库运行缓慢这个问题是常见还是在特定时间出现 如果数据库运行缓慢是一个常见的问题那么可以在问题出现的时候收 ...

最新文章

  1. IT业爆发“新人”争夺战
  2. mysql基础sql语句_SQL基础语句汇总
  3. python中def fun(a、b=200)_python中的函数的参数和可变参数
  4. UC Berkeley提出变分判别器瓶颈,有效提高对抗学习平衡性
  5. SystemInit时钟系统初始化函数剖析
  6. Python 列表 reverse( )方法
  7. 岳阳机器人餐厅在哪_普渡科技推出送餐与回盘两款全新餐饮机器人,打造“一来一回”新闭环...
  8. IEC 60335-2-21:2022 安全-第2-21部分:储水式热水器的特殊要求
  9. python运行后闪退_怎样让python运行完了不直接退出?
  10. 实现一个内存池管理的类
  11. C++——队列应用——显示二项式系数
  12. 水准测量的各种数字考点
  13. spring-kafka广播模式配置_小学校园智能广播系统方案(定压广播)
  14. USB gadget设备驱动解析
  15. Android flac to wav
  16. 苹果6s登录id显示无法连接服务器,iPhone6s appleID无法登入
  17. 如何正确选择电磁流量计
  18. js写一个开心消消乐
  19. BigDecimal中divide方法详解
  20. modbus协议(2)

热门文章

  1. 整数数组的最大子数组
  2. Activity的传递数据与实例
  3. 使用generator自动生成Mybatis映射配置文件
  4. ios授权登录过程中一直提示“没有安装qq”
  5. Firewalld防火墙转换成Iptables
  6. win 10专业版中虚拟机里面无法按打开centos镜像
  7. Lynis – 用于Linux服务器的自动安全审计工具
  8. Shell 脚本来监控 Linux 系统的内存
  9. 为监控主机添加SNMPv3模板
  10. shell脚本100例