quartz详解2--jobDataMap

Quartz 2.2.1学习笔记 (二) Jobs、JobDetail、JobDataMap Jobs与JobDetails正如第一篇文章看到的那样,实现一个Job是非常简单的,只需要完成execute()方法就行了。 那么Jobs与JobDetails有什么关系呢?简而言之,Job是对任务的一个具体实现;谁执行了这个任务呢?这就需要JobDetail来实现,所以JobDetail就是Job的一个具体实例;如9点上语文课是一个具体任务,而刘老师在9点上语文课就是这个任务的一个具体实例。 阅读详情
AI摘要

本文详细介绍了Quartz定时任务框架中的Job和JobDetail概念及其生命周期,JobExecuteContext的作用,以及如何利用jobDataMap进行数据传递。

1. Job 和 JobDetail

Job接口,只有一个execute()方法。
源码:

package org.quartz;

public interface Job {
    void execute(JobExecutionContext var1) throws JobExecutionException;
}

我们开发者只要实现此接口,实现execute方法即可。把我们想做的事情,在execute中执行即可。

/ 1 / Job实例在quartz中的生命周期

每次调度器调度job时,在执行execute方法前都会创建新的job实例。
当调用完成后,关联的job实例会被释放,会GC回收。

/ 2 / JobDetail属性

JobDeail为job实例提供了许多设置属性,存储job实例的状态信息。调度器需要借助jobdetail对象来添加job实例。

属性:

  1. name
  2. group
  3. jobClass
  4. jobDataMap

解析:

JobDetail jobDetail = JobBuilder
                .newJob(PrintJob.class)
                .withIdentity("myjob","group1")
                .build();
System.out.println(jobDetail.getKey().getName());
System.out.println(jobDetail.getKey().getGroup());
System.out.println(jobDetail.getJobClass().getName());

说明:
每个JobDetail和Trigger都name和group组成的key。

显示信息:

myjob
group1(group不写则默认DEFALT)
cn.whbing.pro.quartz.PrintJob

2. JobExecuteContext

1.当scheduler调用一个job,就会将jobExecuteContext传递给job的execute方法。

2.job能够通过对象访问到quartz运行时候的环境以及job本身的明细数据。


3. jobDataMap

1.在进行任务调度时,jobDataMap存储在jobExecuteContext,非常方便获取。
2.jobDataMap可以用来存储任何可以序列化的数据对象,当job实例对象被执行时,这些参数对象会传递给它。
3.jobDataMap实现了Map接口。


4. 实验

目标:在scheduler中传入jobDataMap,在job中通过jobExecuteContext获取。
方法:在jobScheduler或Trigger上使用链式方法usingDataMap()绑定数据。

具体获取有两种方法:
方法一:在Map中获取
方法二:Job实现类中添加setter方法对应JobDataMap的键值(在初始化job实例时会自动调用setter方法)

/ 1 / 在JobDetail和Trigger实例上绑定JobDataMap

 //1.创建JobDetail实例,并与printJob Class绑定
 JobDetail jobDetail = JobBuilder
         .newJob(PrintJob.class)
         .withIdentity("myjob","group1")
         .usingJobData("message","hello myjob1")
         .usingJobData("FloatJobValue",3.14F)
         .build();
 //2.定义Trigger实例,定义该job立即执行,并且每隔两秒重复执行一次,直到永远
 Trigger trigger = TriggerBuilder
         .newTrigger()
         .withIdentity("mytrigger","group1")
         .usingJobData("message","hello mytrigger1")
         .usingJobData("DoubleTriggerValue",5.21D)
         .startNow()...

方法1:通过Map获取

/ 2(A) / 在Job中通过context获取JobDetail和Trigger本身信息,及JobDataMap信息

public class PrintJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //编写具体的业务逻辑即可
        //打印当前时间及hello
        LocalDateTime timeNow = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd hh:mm:ss");
        System.out.println("execute time:"+formatter.format(timeNow));

        System.out.println("hello!");

        //获取jobDetail和trigger信息
        System.out.println("My job name and group:"
                        +context.getJobDetail().getKey().getName()
                        +","+context.getJobDetail().getKey().getGroup());
        System.out.println("My trigger name and group:"
                        +context.getTrigger().getKey().getName()
                        +","+context.getTrigger().getKey().getGroup());
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        JobDataMap tdataMap = context.getTrigger().getJobDataMap();

        String message = dataMap.getString("message");
        System.out.println(message);
        //trigger和其他字段同理
    }
}

结果:

execute time:2018 07 30 08:04:25
hello!
My job name and group:myjob,group1
My trigger name and group:mytrigger,group1
hello myjob1

/ 2(B) / 在Job中通过context获取getMergedJobDataMap
(需保证jobDetail和Trigger中无重复key)

//通过getMergedJobDataMap获取jobdetail和trigger合并后的信息
JobDataMap data = context.getMergedJobDataMap();
//当有相同的key时,先获取jobdetail中的,trigger中的key会覆盖jobdetail
System.out.println(data.getString("message"));

结果:

hello mytrigger1

方法二:Job实现类中添加setter方法对应JobDataMap的键值
(需保证jobDetail和Trigger中无重复key)

说明:类自动注入(连注解都不需要),将通过反射直接将scheduler中的jobdetail或trigger中的jobDataMap的key,通过setter赋予对应字段(名称要相同)

public class PrintJob implements Job {

    private String message;
    private Float FloatJobValue;
    private Double DoubleTriggerValue;

    getter and setter...
    ...
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
       //直接通过setter后的字段访问
        System.out.println("直接通过字段访问1:"+message);
        System.out.println("直接通过字段访问2:"+FloatJobValue);
        System.out.println("直接通过字段访问3:"+DoubleTriggerValue);
    }

结果:(表明有相同字段时,这时以jobdetail为准)

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

相关推荐

Java 定时任务--Quartz框架

Quartz是一个定时任务调度框架,可以将其理解为一个闹钟,可以设置在具体的某个时间,同样可以设置是否按某种规则循环。

努力挣钱的Dora 2216

quartz定时任务中JobDataMap的使用场景-1

开篇 如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。 技术栈 >> java 邮箱 >> 15673219519@163.com 描述 JobDataMap可以在定时任务中存储数据,可以通过触发器获取使用,如下: JobDataMap jobDataMap = JobExecutionContext.getTrigger().getJobDataMap(); long value = Long.parseLong((String) jobData

放码过来 4432

Quartz2.2.1深入Job、JobDetail、JobDataMap、Trigger

Quartz2.2.1深入Job、JobDetail、JobDataMap、Trigger ,具体效果和过程看博文:http://blog.youkuaiyun.com/evankaka/article/details/45361759

Quartz---JobDataMap使用的两种方式

有两种方式可以从执行方法的上下文中取出参数:一种是直接从execute方法的上下文中取出,另一种是在作业类中定义参数名称,并完成相应的get和set方法。JobDataMap是Quartz调度器中的一个重要组件,主要用于存储和传递与作业(Job)相关的数据。这些对象在作业执行时可以被获取并使用。当任务详细类中的JobDataMap设置的key和调度器类设置的key一样的话,后者会覆盖前者的值。通过Job子类的set方法将属性赋值,在添加jobdata时将key值设为set方法中设置的属性名。

weixin_53333436的博客 1780

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5692

RH850_U2A系列HSM安全核开启但是固件未烧录导致无法启动也无法再烧入固件废板问题分析解决

hsm核导致的安全锁死补救方案

u011941262的博客 1732

Quartz 2.3.2 jobDataMap修改无效 不生效问题

然后在调用的job业务中 将原来的job删除 新加一个job并设置新的触发时间点 但是其中的jobDataMap部分的数据在下一次 并不会正常的更新触发。即这里的usingJobData设置的值在下一次执行job时 取的仍然是第一次 初始设置的值 以后都是这个初始值 并不会因为重新设置而修改。executeInternal方法内 将JobDataMap将到 业务的service层里 然后进行对应的key修改才会生效 如下图。这个版本的StatefulJob 已经过期 需要将对应的注释放到新的类上。

wdd668的专栏 884

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5324

Quartz Scheduler(2.2.1) - Usage of JobDataMap

The JobDataMap can be used to hold any amount of (serializable) data objects which you wish to have made available to the job instance when it executes. JobDataMap is an implementation of the Java Map...

weixin_30888413的博客 102

WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)

本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。

potato的博客 567

基于AutoDL复现A-LOAM

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。在autodl上面租服务器,地区我租的重庆A区的,GPU我选择的是RTX4090,基础镜像选择的是Miniconda / conda3 / 3.8(ubuntu20.04)/11.6。在AutoDL中我使用的方式是先将该数据集先下载到自己的电脑上,然后再上传到虚拟机中。用MobaXterm解决该问题!搜到的一个解决方式:该问题属于ceres版本问题,将A-LOAM下的。

m0_61281610的博客 1942

Quartz--Demo2 job实现类中的setter覆盖JobDataMap中的key

package com.lz.quartz.job; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.time.Instant; import java...

luzhensmart的专栏 377

OpenOCD入门到精通:第 1 章 OpenOCD 概述

OpenOCD是一款开源的片上调试工具,支持60+调试适配器和8大处理器架构。它提供三大核心功能:片上调试、在系统编程和边界扫描测试。作为嵌入式开发工具链的中间桥梁,OpenOCD连接上层IDE/GDB与底层硬件,采用分层架构设计实现硬件兼容性。其配置基于Tcl脚本语言,支持网络服务接口,广泛应用于ARM、RISC-V等芯片的调试与烧录场景。

从事嵌入式linux android驱动开发,拥有全栈能力 1398

Quartz入门例子简介 从入门到菜鸟(四)

忙了两天 补充一下姿势。  这次讲Quartz中Job的参数传递和状态保存。  先贴代码,还是两个类:  任务定义: MyParaJob.java  Java代码   //这两行注解。。。 极度坑爹,也是和2.0之前版本所不同的地方,务必注意 @NOTICE   @PersistJobDataAfterExecution   @DisallowCo

秦黎明的博客 778

基于OpenCV的实时疲劳检测系统实现

本文介绍了一个基于OpenCV的实时疲劳检测系统,使用Python实现。系统通过Haar级联分类器检测人脸和眼睛,计算眼睛宽高比(EAR)和PERCLOS(眼睛闭合时间比例)来评估疲劳程度,分为4个等级:正常、轻度、中度和重度疲劳。核心代码包含人脸眼睛检测、疲劳评估和可视化显示功能,具有实时性、稳定性和直观的视觉反馈。系统可通过摄像头实时监控驾驶员状态,为疲劳驾驶预警提供简单有效的解决方案。

weixin_62135607的博客 232

华为OD机试真题 新系统2026-04-01 C++ 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 376

Quartz框架入门学习(一)

Quartz的使用

点点带你 6486

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Quartz JobDataMap 获取方法在Job 实现类中添加setter 方法

package com.satisfy; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org...

ane9542的博客 242

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring Boot 2.0定时任务调度:Quartz动态管理与集群实践

在微服务体系与业务平台中,定时任务调度是支撑订单超时关闭、促销自动上下架、数据补偿等场景的基础能力。Spring Boot自带的@Scheduled注解虽能快速实现静态周期触发,却难以应对执行策略动态调整与任务状态持久化等工程需求。Quartz作为老牌任务调度框架,通过Job、Trigger、Scheduler三层模型,将“做什么”“何时做”“由谁调度”解耦,支持Cron与SimpleTrigger等多种触发方式,并可借助JDBC持久化将任务元数据与运行状态落库,在应用重启后自动恢复调度现场。结合Sprin

weixin_30536861的博客 137

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Quartz教程三:Job与JobDetail介绍

本系列教程由quartz-2.2.x官方文档翻译、整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正;有兴趣研究源码的同学,可以参考我对quartz-core源码的注释(进行中)。 正如在教程二中讲到的,Job实现起来很容易,该接口只有一个“execute”方法。本节主要关注:Job的特点、Job接口的execute方法以及JobDetail。 你定

ccecwg的专栏 1072

配置 quartz 报错

错误信息:nested exception is java.lang.NoSuchMethodError: org.quartz.JobDataMap.put(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;后来发现是quartz这个jar包的版本太低,改到2.2.1就解决了 <dependency><groupId&...

wzr_666666的博客 761

解决Spring中使用quartz发生NotSerializableException methodInvoker的问题

Spring2.5 + quartz1.6.5 发生如下异常   Caused by: org.quartz.JobPersistenceException: Couldn't store job: Unable to serialize JobDataMap for insertion into database because the value of property 'meth

u012903926的专栏 8006
上一篇: java8--日期时间
下一篇: quartz详解3-Trigger
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值