springboot整合quartz(一)

【Quartz】Quartz定时任务框架 Quartz是一个框架,是SpringBoot御用的定时任务框架,有三大核心部分组成,分别是JobTriggerScheduler。Job:任务,可以理解成你要做什么事,具体要执行的业务逻辑,比如:发送短信、同步数据、发送邮件等。Trigger:触发器,可以理解成你什么时候去做,用来定义Job触发条件、触发时间、触发间隔、终止时间等。Scheduler:调度器,可以理解成你什么时候要去做什么事,它会启动Trigger去执行Job。/*** @author : 黎剑。 阅读详情

基本的quartz用法

引入quartz的包

创建一个JobQuartz类,并实现Job接口重写execute接口

public class JobQuartz implements Job {

    public JobQuartz() {
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("定时任务执行了"+sdf.format(new Date()));
    }
}

 创建一个TestQuartz类,用来测试

public class TestQuartz {

    public static void main(String[] args) {
        /**
         * 表示一个具体的可执行的调度程序
         */
        JobDetail jobDetail = newJob(JobQuartz.class).withIdentity("myJob", "group1").build();
        //定义一个Trigger
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                            //scheduler启动后立刻执行
                            .startNow()
                            //每个5秒钟执行一次
                            .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5)
                                 //重复执行
                                .repeatForever()
                            ).build();


        //创建scheduler
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

启动项目,控制台打印结果。说明测试成功。

 quartz传参

如果我们需要在JobDetail给Job中传递参数时

修改JobDetail代码以及Job类代码

JobDetail jobDetail = newJob(JobQuartz.class).withIdentity("myJob", "group1")
                .usingJobData("jobSays", "Hello World!")
                .usingJobData("myFloatValue", 3.141f)
                .build();
@Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        /**
         * 获取到参数的map集合
         * 然后根据key来获取值
         */
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String jobSays = jobDataMap.get("jobSays").toString();
        float myFloatValue = Float.parseFloat(jobDataMap.get("myFloatValue").toString());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("定时任务执行了"+sdf.format(new Date())+"jobSays值为"+jobSays+"myFloatValue值为"+myFloatValue);
    }

 打印结果为:说明我们已经成功的获取到了JobDetail中传过来的值

如果你希望jobSays和myFloatValue的值可以自动注入

修改JobQuartz接口代码如下,同样可以获取到JobDetail中传过来的值

public class JobQuartz implements Job {

    private String jobSays;

    private float myFloatValue;

    public JobQuartz() {
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        /**
         * 获取到参数的map集合
         * 然后根据key来获取值
         */
        //JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        //String jobSays = jobDataMap.get("jobSays").toString();
        //float myFloatValue = Float.parseFloat(jobDataMap.get("myFloatValue").toString());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("定时任务执行了"+sdf.format(new Date())+"jobSays值为"+jobSays+"myFloatValue值为"+myFloatValue);
    }

    public String getJobSays() {
        return jobSays;
    }

    public void setJobSays(String jobSays) {
        this.jobSays = jobSays;
    }

    public float getMyFloatValue() {
        return myFloatValue;
    }

    public void setMyFloatValue(float myFloatValue) {
        this.myFloatValue = myFloatValue;
    }
}

Job状态与并发

我们经常会遇到这种情况,比如说定时任务的间隔为5秒,但是具体任务花费了10秒。此时定时任务会如何执行呢?

修改JobQuartz代码和TestQuartz。我们让定时任务每次执行时休眠8秒,然后定时任务的间隔时间为5秒

 看执行结果会发现,仍然是每5秒执行一次。但是如果我们想让上一次任务没有执行完时,不会执行下一次的任务呢?

@DisallowConcurrentExecution

将该注解加到job类上,告诉Quartz不要并发地执行同一个job定义(这里指特定的job类)的多个实例。

用上面的列子来说明就是:

如果上一个job任务没有执行完成,那么下一个任务就不会执行(对于同一个JobDetail来说)

如果同一个job绑定到不同的JobDetail上面,那么多个JobDetail之间是可以并发执行的

@PersistJobDataAfterExecution

将该注解加在job类上,告诉Quartz在成功执行了job类的execute方法后(没有发生任何异常),更新JobDetail中JobDataMap的数据,使得该job(即JobDetail)在下一次执行的时候,JobDataMap中是更新后的数据,而不是更新前的旧数据。

我们继续修改JobQuartz代码如下,我们将jobSays的值修改为:update

@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class JobQuartz implements Job {

   /* private String jobSays;

    private float myFloatValue;*/

    public JobQuartz() {
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        /**
         * 获取到参数的map集合
         * 然后根据key来获取值
         */
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String jobSays = jobDataMap.get("jobSays").toString();
        float myFloatValue = Float.parseFloat(jobDataMap.get("myFloatValue").toString());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            System.out.println("定时任务执行了"+sdf.format(new Date())+"jobSays值为"+jobSays+"myFloatValue值为"+myFloatValue);
            jobDataMap.put("jobSays","update");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 控制台的打印结果,会发现我们成功的将jobSays的值修改为:update

使用了@PersistJobDataAfterExecution注解,我们强烈建议你同时使用@DisallowConcurrentExecution注解,因为当同一个job(JobDetail)的两个实例被并发执行时,由于竞争,JobDataMap中存储的数据很可能是不确定的。

 

作业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理 我们一直没有太深入的去完成 一个job 类,因为这是跟你的实际应用紧密相关联的,但是在你的job 处理过程中 如果 发生了异常,那么会怎么样处理呢 ? 客官您往下看………… ------------------------------------我是分割线------------------------------------------------ 如果客官看过前面的几篇 烂的掉渣的 文 阅读详情

相关推荐

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 528

详解Quartz中的注解:@DisallowConcurrentExecution和@PersistJobDataAfterExecution

这两个注解是用在哪里的? 1,注解@DisallowConcurrentExecution和@PersistJobDataAfterExecution都是用在org.quartz.Job的实现类上的。 2,都是针对JobDetail实例的,而不是Job实现类的。 注解说明: @PersistJobDataAfterExecution:告诉Quartz在成功执行了Job实现类的execute方法后(没有发生任何异常),更新JobDetail中JobDataMap的数据,使得该JobDetail实例在下一

wh_07的博客 2万+

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1139

Quartz任务调度Job有无状态

有状态的job和无状态的job @PersistJobDataAfterExecution注解的使用 有状态的job可以理解为多次Job调用期间可以持有一些状态信息,这些状态信息存储在JobDataMap中,而默认的无状态job每次调用时都会创建一个新的jobDataMap 添加count的setter和getter方法 public Integer getCount() { return...

小徐的博客 1519

【ArcGIS教程】基于DEM数据的洪水淹没分析——提取淹没区并计算淹没区洪水量

使用ArcGIS开展洪水淹没区分析、提取淹没区并计算淹没区洪水量的详细说明,如果想获取教程中实验数据,请关注微信公众号【GIS小能手】然后在后台留言。

weixin_45469245的博客 6817

ONFI5.0命令字实战指南:从基础操作到高级应用

本文深入解析ONFI5.0协议的核心——命令字,提供从基础操作到高级应用的实战指南。详细拆解了NAND闪存的复位、读状态、数据读取(00-30)、页编程(80-10)和块擦除(60-D0)等关键命令周期,并探讨了多平面操作与缓存操作等高级性能优化技巧,帮助开发者高效、稳定地与NAND芯片进行底层交互。

vscode5coder的博客 462

@DisallowConcurrentExecution,@PersistJobDataAfterExecution注解

用在哪里 都是用在Job实现类上。作用于JobDetail实例 @DisallowConcurrentExecution Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。 @DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但可以同时执行多个Job, 而是不能并发执行同一个JobDetail, 可以同时执行多个不同的Job

qq_44073614的博客 1699

数据结构(超详细讲解!!)第十七节 队列应用(杨辉三角)

杨辉三角

2201_76115387的博客 1375

一、springboot与quartz的整合

一、背景 1.因为需求需要,所以我们用到了定时任务,但是之前使用的定时任务是基于spring的xml形式,但是在微服务的模块中这显然不太合适,因为单独的模块,做成了独立的服务,所以我最终选择了基于注解的方式来完成我们的需求。 2.所以我写了一个小demo来让大家借鉴先怎么使用springboot与quartz的合起来使用。下面我们就进入今天的学习内容。 二、quartz的简介 1.Quar...

码农小默 4万+

大厂面试:字节跳动大数据面试题及参考答案(10万字长文及多张原理图持续更新)

在 Spark 中,宽窄依赖是用来描述 RDD(弹性分布式数据集)之间的依赖关系的概念。窄依赖是指父 RDD 的每个分区最多被一个子 RDD 的分区使用,即子 RDD 的分区可以通过确定的规则从父 RDD 的分区计算得到,并且不需要跨节点进行数据传输。窄依赖通常可以在一个节点上进行计算,不需要进行数据的 shuffle 操作,因此性能较高。宽依赖是指父 RDD 的一个分区可能被多个子 RDD 的分区使用,即子 RDD 的分区需要通过跨节点的数据 shuffle 操作从父 RDD 的多个分区获取数据。

大模型大数据攻城狮的专栏 1650

STM32外部中断EXTI原理与飞控实时应用实战

外部中断(EXTI)是嵌入式系统中实现事件驱动和实时响应的核心机制,其本质是将外部电平变化转化为可调度的CPU中断事件。基于ARM Cortex-M NVIC架构,EXTI通过GPIO-EXTI-NVIC三级硬件通路实现低延迟信号捕获,具备边沿触发、优先级管理与挂起控制等关键能力。在四轴飞控、工业传感器、人机交互等对毫秒级响应有强需求的场景中,EXTI显著优于轮询方式,兼顾实时性与CPU资源效率。实际开发需严格遵循SYSCFG映射→EXTI配置→NVIC使能的时序逻辑,并规避常见陷阱如中断号误配、伪触发、低

weixin_36382073的博客 64

quartz(一)SpringBoot整合quartz

一、组成: Quartz 设计的核心类包括 Scheduler, Job 以及 Trigger。其中,Job 负责定义需要执行的任务,Trigger 负责设置调度策略,Scheduler 将二者组装在一起,并触发任务开始执行。 1、job:使用者只需要创建一个 Job 的继承类,实现 execute 方法 2、JobDetail 负责封装 Job 以及 Job 的属性,并将其提供给 Sche...

w_t_y_y的博客 1240

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SpringBoot整合(一)SpringBoot整合Redis、ES7.6、Quartz

SpringBoot整合(一)SpringBoot整合Redis、ES7.6、Quartz

qq_44665283的博客 2211

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

spring boot 与quartz整合(一)

springboot本身可以使用@EnableScheduling注解进行定时任务 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 @Component //加入spring容器 @EnableScheduling //开启对定时任务的支持 public class Myjob { @Scheduled(cron = "*/5 * * * * ?")...

喜欢DNF的小黑猫的博客 305

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

quartz cron 每周一_springboot整合quartz

想要定时或周期性的执行一些任务(比如:定时清除系统的缓存;信用卡每月25号自动扣款;再或者每天12点从网址扒拉一些每日更新的爱情动作片…),quartz 就是干这种事情的( quartz :别污蔑我)。没有其他的定时任务方案了吗?有, quartz 功能更加强大。1、TimerTask (jdk 自带)2、ScheduledExecutorService (基于线程池设计,jdk 自带)3、Spr...

weixin_32678427的博客 261

12.SpringBoot2 整合Quartz2(一)

Springboot 是当下最流行的一个java框架了, 它大大降低了开发人员集成框架的时间, 提升了开发效率. 但是springboot 集成quartz时却没有想象地那么简单, 而且网上文章集成方式各种各样, 笔者在浏览数篇整合博客之后, 感觉整合方式并不符合笔者的开发习惯, 因此便决定自己进行整合. 整合过程也时一波三折, 笔者将用两篇博客分享. 整合目标: 任意springbean中的...

Java 程序源 2万+

springboot整合quartz入门(一)

1、quartz中的组件介绍 ①、Scheduler:quartz的主要API,通过它控制quartz下面的组件 ②、job:任务接口,通过实现该接口可以自定义需要定时执行任务 ③、jobDetail:具体Job实例,需要name和group生成job的唯一key,scheduler通过该key控制任务的暂停、运行、删除等操作。 ④、Trigger:触发器,用来定义任务的执行计划。 SimpleTrigger:可以配置任务的开始时间、结束时间、重复次数以及重复的间隔。 CronTri

plmzaqokn11的博客 380

看一篇搞懂quartz框架、什么是quartz定时任务、spring boot整合quartz框架实现定时任务,附代码(保姆级教程一)

spring boot、quartz

zhangfuping123456789的博客 4192

quartz与springboot整合实现分布式调度(一)

Quartz任务调度框架之最全Quartz系统参数配置详解:https://blog.youkuaiyun.com/zixiao217/article/details/53091812

yrsg666的博客 360

springboot 整合quartz (一):基础使用

layout: blog istop: true title: “springboot 整合quartz (一):基础使用” date: 2018-10-09 category: springboot tags: springboot quartz 介绍 Quartz是一个开源的作业调度框架,它完全由Java写成。它有很多特征,如:数据库支持,集群,插件,EJB作业预构 建,JavaMa...

开心的哈士奇 601

quartz 注解 mysql_Quartz+Mybatis+SpringMvc+SpringBoot整合(一)

Quartz简介:Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制等等等,官网http://www.quartz-scheduler.org/这篇文章主要讲的如何实现Quartz与SSM整合以及前端使用vue+ElementUI实现简单的任务管理页面实现的功能:页面内添加/编辑/删除/暂停/恢复/停止/终止任务,支持页面内编辑cron...

weixin_34391934的博客 434

springboot 2.x整合Quartz(一)

集成quartz的两种方式说明 spring使用quartz大致有2种方式: 一是任务类继承QuartzJobBean, 二是在xml文件里定义任务类和要执行的方法,为了简化配置和快速开发,一般使用第一种较多。 pom <!--quartz相关依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-s...

liso00的博客 297
上一篇: springboot整合rabbitmq实现消息确认机制
下一篇: springboot整合quartz(二)
若往夕之
博客等级 码龄9年 20粉丝 82原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值