@Scheduled任务调度/定时任务-非分布式

1、功能概述

任务调度就是在规定的时间内执行的任务或者按照固定的频率执行的任务。是非常常见的功能之一。常见的有JDK原生的Timer, ScheduledThreadPoolExecutor以及springboot提供的@Schduled。分布式调度框架如QuartZ、Elasticjob、XXL-JOB、SchedulerX、PowerJob等。

本文主要讲解非分布式环境下的@Scheduled任务调度讲解,以及@Scheduled结合多线程和@Async异步任务的使用。

当然在任务不是很多的情况下@Scheduled也可以结合如Redis的锁机制实现分布式的任务调度,但是还是建议在分布式环境下,使用分布式调度框架如:QuartZ、Elasticjob、XXL-JOB、SchedulerX、PowerJob等。

2、@Scheduled基本使用

2.1、创建springboot工程引入包信息

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.txc</groupId><artifactId>scheduleddemo</artifactId><version>0.0.1-SNAPSHOT</version><name>scheduleddemo</name><description>scheduleddemo</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

2.2、按照固定间隔执行

fixedDelay:按照固定间隔执行,上一个任务的结束到下一个任务的开始间隔。

initialDealay:延迟启动,启动之后指定时间再执行调度任务

@EnableScheduling:开启任务调度,写在类上只开启当前类中的任务调度,如果写在启动类上则开启项目中的所有任务调度。

@Slf4j
//加载类型开启类中,加载启动类上,开启整个项目
@EnableScheduling //是否开启
@Component
public class MyScheduled {@Scheduled(fixedDelay = 3000,initialDelay = 3000)public void process(){log.info("=====process执行========"+ LocalDateTime.now());}
}

结果分析:

从输出结果中可以看出,程序每隔3s执行一次

2.3、按照固定频率执行任务

说明1fixedRate:按照固定频率执行任务,如每三秒执行一次,上一个任务下次任务的开始,由于此时是单线程,下一个任务开始需要等上一个任务结束。

说明2:我们通过Thread.sleep(5000)设置任务执行需要2s时间

@Slf4j
//加载类型开启类中,加载启动类上,开启整个项目
@EnableScheduling //是否开启
@Component
public class MyScheduled {
@Scheduled(fixedRate = 3000,initialDelay = 3000)
public void process() throws InterruptedException {
log.info("=====process执行fixedRate开始========"+ LocalDateTime.now());Thread.sleep(2000);log.info("=====process执行fixedRate结束========"+ LocalDateTime.now());}
}

结果分析:
从结果中可以看出由于设置process执行的时间为2s钟,process按照固定的频率(3s)3s执行一次,第一次开始是22:19:22,第二次开始是22:19:25

2.4、按照固定频率执行任务

说明1fixedRate:按照固定频率执行任务,如每三秒执行一次,上一个任务下次任务的开始,由于此时是单线程,下一个任务开始需要等上一个任务结束。

说明2:我们通过Thread.sleep(5000)设置任务执行需要5s时间

@Slf4j
//加载类型开启类中,加载启动类上,开启整个项目
@EnableScheduling //是否开启
@Component
public class MyScheduled {
@Scheduled(fixedRate = 3000,initialDelay = 3000)
public void process() throws InterruptedException {log.info("=====process执行fixedRate开始========"+ LocalDateTime.now());Thread.sleep(5000);log.info("=====process执行fixedRate结束========"+ LocalDateTime.now());}
}

结果分析:

从结果可以看出:虽然设置固定的频率是3s,但是由于在单线程情况下下次任务的开启需要等待上一个任务的结束,第一次任务开始时间为22:17:43,第二次任务开启时间为22:17:48中间间隔了5s钟。

2.5、通过公式设置定时任务

cron:可以通过特性的公式设定定时任务,任务生成网站https://cron.qqe2.com/

如:可以设置每周三下午五点执行,每月的月尾执行一次等。

如上图生成的语法表示:每分钟的前五秒执行process

@Slf4j
//加载类型开启类中,加载启动类上,开启整个项目
@EnableScheduling //是否开启
@Component
public class MyScheduled {
@Scheduled(cron ="0,1,2,3,4 * * * * ? ")
public void process() throws InterruptedException {log.info("=====process执行fixedRate开始========"+ LocalDateTime.now());Thread.sleep(5000);log.info("=====process执行fixedRate结束========"+ LocalDateTime.now());}
}

结果分析:

从图中可以看出每每分钟开始的时候执行,五秒后结束。

3、@Scheduled与多线程

加入多线程的目的是为了程序执行的效率能够提高。但是在设置多线程的时候,不能开辟过多的线程,因为线程资源非常的消耗cpu资源,必要的时候需要使用分布式任务调度。

3.1、非多线程的情况

理论上当process1结束的时候,下次process1启动的时候需要等待process2执行结束,否则1不能启动,应该这个时候依旧是单线程。

@Slf4j
//加载类型开启类中,加载启动类上,开启整个项目
@EnableScheduling //是否开启
@Component
public class MyScheduled {
@Scheduled(fixedDelay = 3000)
public void process1() throws InterruptedException {
log.info("=====process1执行开始========"+ LocalDateTime.now());Thread.sleep(5000);log.info("=====process1执行结束========"+ LocalDateTime.now());}
@Scheduled(fixedDelay = 3000)
public void process2() throws InterruptedException {log.info("=====process2执行开始========"+ LocalDateTime.now());Thread.sleep(5000);log.info("=====process2执行结束========"+ LocalDateTime.now());}
}

结果分析:

从输出结果可以看出process2的开始是等到process1结束后才执行的。

3.2、多线程的情况

在启动类中定义线程池。值不需要设置太大,现成对cpu资源消耗大,搞不好容易让系统宕机。

设置多线程后直接启动程序,继续观看process1和process2的输出情况。

package com.txc.scheduleddemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@SpringBootApplication
public class ScheduleddemoApplication {public static void main(String[] args) {SpringApplication.run(ScheduleddemoApplication.class, args);}@Beanpublic TaskScheduler taskScheduler(){ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();//设置线程池中线程的数量//多线程对cpu资源消耗较大,值不能太大。taskScheduler.setPoolSize(5);return taskScheduler;}}

结果分析:

process1和process2使用的是不同的线程,一个线程为taskSheduler-1,一个线程为taskSheduler-2。

而且process1和process2是同时启动的,没有出现相互等待的情况,因为现在使用的是多线程的情况。

4、@Scheduled与@ Async异步任务

在上面的案例中虽然process1和process2同时执行了,没有出现相互等待的情况。但是第二次process1和process2执行依旧是等待程序5s结束后再等待3是执行。

name如何能够实现即使process1执行时间为5s,但是下一次process1的启动依旧是3s后。而不是当前的8是后。这就可以使用异步任务@Async。当然复杂的异步任务还是建议使用如MQ技术。

注意点:@Async的使用需要写在单独的一个类中,不能与当前调用业务写在一起,否则不生效。

完全不会使用@Async看如下博客:

https://blog.csdn.net/tangshiyilang/article/details/129440283

4.1、创建异步任务类及异步方法

@Component
public class AsyncTaskScheduled {@Async//那个方法需要使用异步调用,就使用该注解public void asyncMethod() {try{Thread.sleep(6000);//模拟异步执行业务的时间}catch (Exception e){System.out.println(e.getStackTrace());}}
}

4.2、需要再启动类上开启异步任务

@EnableAsync:开启异步任务调度

@SpringBootApplication
@EnableAsync
public class ScheduleddemoApplication {public static void main(String[] args) {SpringApplication.run(ScheduleddemoApplication.class, args);}@Beanpublic TaskScheduler taskScheduler(){ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();//设置线程池中线程的数量//多线程对cpu资源消耗较大,值不能太大。taskScheduler.setPoolSize(10);return taskScheduler;}}

4.3、创建process3和process4方法

process3和process3与之前的process1和process2方法一样都是基于多线程操作。

@Slf4j
//加载类型开启类中,加载启动类上,开启整个项目
@EnableScheduling //是否开启
@Component
public class MyScheduled {
@Autowired
AsyncTaskScheduled asyncTaskScheduled;
@Scheduled(fixedDelay = 3000)
public void process3() throws InterruptedException {
log.info("=====process3执行开始========"+ LocalDateTime.now());asyncTaskScheduled.asyncMethod();log.info("=====process3执行结束========"+ LocalDateTime.now());}
@Scheduled(fixedDelay = 3000)
public void process4() throws InterruptedException {log.info("=====process4执行开始========"+ LocalDateTime.now());asyncTaskScheduled.asyncMethod();log.info("=====process4执行结束========"+ LocalDateTime.now());}
}

结果分析:

从结果可以看出,虽然异步任务执行的时间为6s,但是process4第一次开始和第二次开始的时间间隔为3s.

5、源码下载

https://download.csdn.net/download/tangshiyilang/88627612

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

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

相关文章

SpringBoot进行自然语言处理,利用Hanlp进行文本情感分析

. # &#x1f4d1;前言 本文主要是SpringBoot进行自然语言处理&#xff0c;利用Hanlp进行文本情感分析&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风…

医保电子凭证在项目中的集成应用

随着医保电子凭证使用普及&#xff0c;医疗行业的各个场景都要求支持医保码一码通办&#xff0c;在此分享一下&#xff0c;在C#和js中集成医保电子凭证的demo 供有需要的小伙伴参考。 一、项目效果图 在c#中集成医保电子凭证效果 在js中集成医保电子凭证效果 二、主要代码 c#…

EasyRecovery2024功能强大且专业的mac电脑数据恢复程序

EasyRecovery15是一款功能强大且专业的IOS数据恢复程序&#xff0c;专为在iPhone&#xff0c;iPad和iPod touch上检索丢失的照片&#xff0c;消息&#xff0c;音乐等而设计。无论您是错误删除还是意外丢失了对您来说重要的任何内容&#xff0c;EasyRecovery都会帮助您找回它们。…

群晖(Synology)新建存储池使用 Home 服务

每一个用户都可以有一个自己的 Home 服务。 这个在群晖存储新建存储池后可以自动启用这个服务。 启用后&#xff0c;可以看到你的文件系统中有一个 homes 的文件了。 群晖&#xff08;Synology&#xff09;新建存储池使用 Home 服务 - 系统容器 - iSharkFly每一个用户都可以有…

flutter调试器查看不了副页面(非主页面/子页面)

刚接触flutter&#xff0c;写了两个页面&#xff0c;通过按钮&#xff0c;可以从主页面跳转到副页面&#xff0c;副页面我自己写的一个独立的dart文件&#xff0c;在主页面的代码中导入使用。但是当我运行代码后&#xff0c;点击跳转的时候&#xff0c;却发现查看不到对应的副页…

nodejs微信小程序+python+PHP沧州地区空气质量数据分析系统-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

1. 卸载mariadb相关rpm # 查找 rpm -qa|grep mariadb rpm -qa|grep mysql# 卸载 rpm -e --nodeps mariadb... rpm -e --nodeps mysql...2. 删除mysql相关文件 # 查找 find / -name mysql# 删除 rm -rf /var/lib/mysql...3. 查看是否有相关依赖&#xff0c;没有需安装 rpm -q…

Android Studio的代码笔记--Adapter+GridView学习

AdapterGridView学习 AdapterGridViewSimpleAdapterGridViewactivity_main.xmlappicon.xmlMainActivity 自定义BaseAdapterGridView已下载应用PackageInfoAppAdapterMainActivity2 其他获取已下载应用信息函数获取所有应用信息函数ImageView产生圆角的方法背景设置很渐变设置选…

Hadoop学习总结(Hive的安装)

Hive的安装模式分为3种&#xff0c;分别是嵌入模式、本地模式、远程模式。 &#xff08;1&#xff09;嵌入模式&#xff1a;使用内嵌的 Derby 数据库存储元数据&#xff0c;这种方式是 Hive 的默认安装方式&#xff0c;配置简单&#xff0c;但是一次只能连接一个客户端&#xf…

模块一——双指针:18.四数之和

文章目录 题目描述算法原理排序双指针 代码实现排序双指针复杂度分析时间复杂度&#xff1a;O(N^3^)空间复杂度&#xff1a;O(log⁡N)或者O(N) 题目描述 题目链接&#xff1a;18.四数之和 算法原理 排序双指针 依次固定⼀个数a &#xff1b;在这个数a 的后⾯区间上&#x…

C#实现支付宝转账功能

环境 .net 6 AlipaySDKNet.OpenAPI 2.4.0 申请证书 登录支付宝开放平台https://open.alipay.com/ 进入控制台 授权回调地址也设置一下&#xff0c;加密方式AES 新建.net 6空白的web项目 证书除了java都需要自己生成一下pkcs1的密钥 privatekey.txt就是根据应用私钥生成…

玩转大数据16:大数据存储与文件格式优化

随着大数据时代的到来&#xff0c;存储和处理海量数据成为了一个重要的挑战。在大数据存储中&#xff0c;选择合适的文件格式对数据的压缩率、读写性能和扩展性起着关键作用。本文将介绍大数据存储的挑战&#xff0c;探讨常见的文件格式&#xff0c;并深入讨论文件格式优化的策…

小新Air-14 Plus 2021款AMD ACN版(82L7)原装出厂Win11系统镜像

LENOVO联想笔记本开箱状态原厂Windows11系统包 链接&#xff1a;https://pan.baidu.com/s/1D_sYCJAtOeUu9RbTIXgI3A?pwd96af 提取码&#xff1a;96af 联想小新AIR14笔记本电脑原厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&am…

Mapreduce小试牛刀(1)

1.与hdfs一样&#xff0c;mapreduce基于hadoop框架&#xff0c;所以我们首先要启动hadoop服务器 --------------------------------------------------------------------------------------------------------------------------------- 2.修改hadoop-env.sh位置JAVA_HOME配…

MBR30300FCT-ASEMI高耐压肖特基MBR30300FCT

编辑&#xff1a;ll MBR30300FCT-ASEMI高耐压肖特基MBR30300FCT 型号&#xff1a;MBR30200FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大平均正向电流&#xff1a;30A 最大重复峰值反向电压&#xff1a;300V 产品引线数量&#xff1a;3 产品内部芯片个数&…

***Cpolar配置外网访问和Dashy

Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具 结合cpolar内网工具,我们实现无需部署到公网服务器…

一文1000字基于Jenkins实现接口自动化持续集成!

一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程&#xff1a;https://blog.csdn.net/YZL40514131/article/details/131504280 3、源码管理 需要将脚本推送到远程仓库中 4、构建触发器 可以选择定时构建…

vite 打包图标icon ,content 内容乱码

问题描述&#xff1a;本地开发环境icon 显示正常&#xff0c;打包后发布线上环境icon乱码&#xff0c;而且具有偶发性&#xff0c;刷新页面乱码又正常了。 找问题&#xff1a;观察发现是content 内容没有编译成功导致乱码 解决&#xff1a;vite.config.ts / vite.config.js 文件…

Facebook运营技巧详解,Facebook多店铺如何运营?

在前不久的文章中就讲过Facebook养号和广告的投放技巧&#xff0c;今天东哥就趁热打铁来接着讲讲Facebook的运营技巧&#xff0c;现在做外贸和跨境电商的人基本上都用过Facebook&#xff0c;像在流量这么庞大的平台上想要抓住更多机遇&#xff0c;懂得一些运营技巧是必不可少的…

数据可视化作用探析

数据可视化是一种将数据转化为图表、图形或其他视觉形式的过程&#xff0c;旨在更直观、更易于理解地展示数据信息。它不仅仅是对数据的简单呈现&#xff0c;更是一种利用视觉化手段帮助人们理解数据、发现模式、分析趋势和做出决策的强大工具。今天&#xff0c;我就从可视化从…