分布式定时任务

news/2024/11/30 13:35:28/

本文引用了谷粒商城的课程

定时任务

定时任务是我们系统里面经常要用到的一些功能。如每天的支付订单要与支付宝进行对账操作、每个月定期进行财务汇总、在服务空闲时定时统计当天所有信息数据等。
定时任务有个非常流行的框架Quartz和Java原生API的Timer类。Spring框架也可以支持定时任务。

cron表达式

语法:秒 分 时 日 月 周 年(Spring 不支持)
http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html

在这里插入图片描述
特殊字符:
在这里插入图片描述

,:枚举: (cron=“7,9,23 * * * * ?”):任意时刻的 7,9,23 秒启动这个任务;
-:范围: (cron=“7-20 * * * * ?”):任意时刻的 7-20 秒之间,每秒启动一次
()* :任意;指定位置的任意时刻都可以
/:步长; (cron=“7/5 * * * * ?”):第 7 秒启动,每 5 秒一次;(cron=“/5 * * * * ?“):任意秒启动,每 5 秒一次;
?:(出现在日和周几的位置):为了防止日和周冲突,在周和日上如果要写通配符使用?(cron=”
* * 1 * ?”):每月的 1 号,启动这个任务;
L:(出现在日和周的位置)”, last:最后一个 (cron=“* * * ? * 3L”):每月的最后一个周二
W:Work Day:工作日 (cron=“* * * W * ?”):每个月的工作日触发 (cron=“* * * LW * ?”):每个月的最后一个工作日触发
#:第几个 (cron=“* * * ? * 5#2”):每个月的第 2 个周 4

注意:日和周几通常会发生冲突,如果日定了,那么周就要使用?通配符

可以在线生成cron表达式
https://cron.qqe2.com/

cron实例
在这里插入图片描述

SpringBoot整合

 * 1、Spring中6位组成,不允许第7位的年* 2、在周几的位置,1-7代表周一到周日:MON-SUN

测试代码如下

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 定时任务*         1、@EnableScheduling开启定时任务*         2、@scheduled 开启一个定时任务* **/
@EnableScheduling
@Component
@Slf4j
public class HelloSchedule {@Scheduled(cron = "*/5 * * * * 4")public void hello(){log.info("hello.....");try {Thread.sleep(8000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

但是这里存在一个问题

定时任务不应该阻塞,默认是阻塞的。(也就是要等业务执行完,定时任务才能开始执行)
在这里插入图片描述
可以使用以下几种解决方案
1)、CompletableFuture.runAsync()可以让业务以异步的方式,自己提交到线程池
2)、支持定时任务线程池设置:

spring.task.scheduling.pool.size=5

3)、让定时任务异步执行
通常是采用第3种方案
开启异步定时任务

  • 异步任务
    1、@EnableAsycn:开启异步任务功能
    2、@Async 给希望异步执行的方法上标注上注解
    3、自动配置类 TaskExecutionAutoConfiguration 属性绑定在TaskExecutionProperties
    4、.配置定时任务的线程池属性:
spring.task.execution.pool.core-size=5
spring.task.execution.pool.max-size=30
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 定时任务*         1、@EnableScheduling开启定时任务*         2、@scheduled 开启一个定时任务* 异步任务*         1、@EnableAsycn:开启异步任务功能*         2、@Async 给希望异步执行的方法上标注上注解*         3、自动配置类 TaskExecutionAutoConfiguration 属性绑定在TaskExecutionProperties*         4.配置:*              spring.task.execution.pool.core-size=5*              spring.task.execution.pool.max-size=30* **/
@EnableScheduling
@Component
@Slf4j
@EnableAsync
public class HelloSchedule {/*** 1、Spring中6位组成,不允许第7位的年* 2、在周几的位置,1-7代表周一到周日:MON-SUN* 3、定时任务不应该阻塞,默认是阻塞的。(也就是要等业务执行完,定时任务才能开始执行)*      1)、CompletableFuture.runAsync()可以让业务以异步的方式,自己提交到线程池*      2)、支持定时任务线程池设置:*          spring.task.scheduling.pool.size=5*      3)、让定时任务异步执行**     解决:使用异步+定时任务来完成定时任务不阻塞的功能。* **/@Async@Scheduled(cron = "*/5 * * * * 4")public void hello(){log.info("hello.....");try {Thread.sleep(8000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

http://www.ppmy.cn/news/47549.html

相关文章

15-Django框架基础(3)

1 Django模板加载与响应 本节我们将重点讲解 Django 的模板语言。 Django 的模板系统将 Python 代码与 HTML 代码解耦,动态地生成 HTML 页面。Django 项目可以配置一个或多个模板引擎,但是通常使用 Django 的模板系统时,应该首先考虑其内置…

干货|手把手教你怎么做好一块PCB!保姆级教程

目录 一.明确设计目标 二.了解所用元器件的功能对布局布线的要求 三. 元器件布局的考虑 四.对布线的考虑 1.传输线 2.传输线的几种类型 3.端接传输线 4.非端接传输线 5.几种端接方式的比较 五.PCB 板的布线技术 一.明确设计目标 接受到一个设计任务,首先要明确其设计目标,是普通…

【vue2】使用elementUI进行表单验证实操(附源码)

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:vue使用elementUI进行表单验证实操(附源码) 【前言】我们在构建一…

Python无框架分布式爬虫,爬取范例:拼多多商品详情数据,拼多多商品列表数据

拼多多是中国领先的社交电商平台之一,是一家以“团购折扣”为主要运营模式的电商平台。该平台上有海量的商品,对于商家和消费者来说都具有非常大的价值,因此,拼多多商品数据的采集技术非常重要。本文将介绍拼多多商品数据的采集技…

SAM(Segment Anything Model)让CV走到尽头?学CV的研究生还能正常毕业吗?怎么使用SAM?

SAM(Segment Anything Model)让CV走到尽头?学CV的研究生还能正常毕业吗?怎么使用SAM? 1. 引言 最近无论是在B站、知乎还是论坛、微博,都看了一些有关SAM的讨论。这个号称“CV界ChatGPT”的模型从出生起就…

藏经阁(七)有源蜂鸣器和无源蜂鸣器 解析

文章目录 特征区别场景选型实战应用 特征 有源蜂鸣器特征: 又被称为直流蜂鸣器包含了一个多谐振荡器只要额定直流电压可以在两端发出声音具有驱动控制简单价格略高 无源蜂鸣器特征: 又被称为交流蜂鸣器内部没有振荡器需要在两端施加特定频率的方波电…

mysql-!=,<>,=,<=>,is区别及使用推荐

!和<> 相同点&#xff1a;两个比较符作用相同 不同点&#xff1a;!是ANSI标准中的一部分&#xff0c;因此也可以用在其他数据库中。而<>只能在mysql中使用。 建议&#xff1a;如果可以都用!&#xff0c;这样可以减少必要的迁移成本&#xff0c;如mysql的sql迁移到…

MVC、MVP、MVVM:谁才是Android开发的终极之选?

概述 MVC、MVP、MVVM 都是在 Android 开发中经常用到的架构思想&#xff0c;它们都是为了更好地分离代码、提高代码可复用性、方便维护等目的而设计的。下面对这三种架构思想进行简单的介绍和比较。 MVC MVC 架构是最早被使用的一种架构&#xff0c;它把程序分成了三个部分&…