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

news2025/1/19 11:15:19

任务调度执行原理图:

JobDataMap的使用

JobDataMap是Quartz调度器中的一个重要组件,主要用于存储和传递与作业(Job)相关的数据。它是一个实现了Java Map接口的对象,可以用来保存一系列的序列化的对象。这些对象在作业执行时可以被获取并使用。

JobDataMap的主要特点包括:

  1. 它可以存储任何可以序列化的数据对象。这意味着你可以将任何类型的对象(只要它们可以被序列化)放入JobDataMap中,并在作业执行时获取这些对象。
  2. JobDataMap实现了JDK的Map接口,并添加了一些便捷的方法来存取基本数据类型。这使得操作数据变得更加方便和高效。
  3. 当使用持久化的JobStore时,需要注意存放在JobDataMap中的内容。因为放入JobDataMap中的内容将被序列化,有时可能会出现类型转换问题。标准Java类型通常很安全,但对于其他类型,如果在序列化过程中改变了类的定义,可能会导致兼容性问题。
  4. JobDataMap可以与触发器(Trigger)相关联。对于每次独立的触发,可以为作业提供不同的输入数据。

在创建和配置调度器时,可以使用JobDataMap来传递参数给作业。有两种方式可以从执行方法的上下文中取出参数:一种是直接从execute方法的上下文中取出,另一种是在作业类中定义参数名称,并完成相应的get和set方法。

任务详情类和触发器类都可以在创建实例的时候设置JobDataMap

方式一

通过其中的usingDataJob()方法设置值,通过JobExecutionContext全局变量获取值

package schedule;

import job.MyJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class MySchedule1 {
    public static void main(String[] args) {
        // 创建作业详情
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)//作业的类名
                .withIdentity("myJob", "group1")//作业的身份标识(名称和组名)
                .usingJobData("jobDetail","jobDetail")
                .build();
        //创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")//触发器的身份标识(名称和组名)
                .usingJobData("trigger","trigger")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()//设置触发器的调度计划
                        .withIntervalInSeconds(3)//设置作业执行的间隔时间为3秒。
                        .repeatForever())//指定触发器应该无限次地重复执行作业。
                .build();
        try {
            // 创建调度器实例
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 将作业和触发器注册到调度器
            scheduler.scheduleJob(jobDetail, trigger);
            // 开始调度
            scheduler.start();
        } catch (SchedulerException se) {
            se.printStackTrace();
        }
    }
}
package job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //获取jobDetail中的JobData
        String jobDetail = jobExecutionContext.getJobDetail().getJobDataMap().getString("jobDetail");
        //获取trigger中的JobData
        String trigger = jobExecutionContext.getTrigger().getJobDataMap().getString("trigger");
        System.out.println(jobDetail);
        System.out.println(trigger);
    }
}

方式二

通过Job子类的set方法将属性赋值,在添加jobdata时将key值设为set方法中设置的属性名

实例

关键修改部分代码

package job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob1 implements Job {
    private String jobDetail;
    private String trigger;

    public void setJobDetail(String jobDetail) {
        this.jobDetail = jobDetail;
    }

    public void setTrigger(String trigger) {
        this.trigger = trigger;
    }

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

//        //获取jobDetail中的JobData
//        String jobDetail = jobExecutionContext.getJobDetail().getJobDataMap().getString("jobDetail");
//        //获取trigger中的JobData
//        String trigger = jobExecutionContext.getTrigger().getJobDataMap().getString("trigger");
        System.out.println(jobDetail);
        System.out.println(trigger);
    }
}
注意事项

当任务详细类中的JobDataMap设置的key和调度器类设置的key一样的话,后者会覆盖前者的值。

关键部分修改:

结果

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

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

相关文章

基于TensorFlow的LibriSpeech语音识别

一、引言 随着人工智能技术的日益成熟,深度学习在语音识别领域取得了显著的突破。本博客将介绍如何使用TensorFlow框架,结合LibriSpeech数据集,构建一个高效的语音识别系统。 目录 一、引言 二、环境准备 为了运行本示例代码,…

冒泡排序:原理、实现与性能分析

引言 在编程世界中,排序算法是不可或缺的一部分。冒泡排序作为最基本的排序算法之一,虽然其效率并不是最高的,但其实现简单、易于理解的特点使得它成为学习和理解排序算法的入门之选。本文将详细介绍冒泡排序的原理、实现方法以及性能分析&a…

java实现排序算法(上)

排序算法 冒泡排序 时间和空间复杂度 要点 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置下一轮冒泡,可以调整未排序的右边界,减少不必要比较 代码 public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i 0; i <…

政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法

如果小伙伴第一次看到这篇文章&#xff0c;可以先浏览一下我这个系列的上一篇文章&#xff1a; 政安晨&#xff1a;【完全零基础】认知人工智能&#xff08;一&#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

【设计模式】4、策略模式

文章目录 一、问题二、解决方案2.1 真实世界的类比2.2 策略模式结构2.3 适用场景2.4 实现方式2.5 优缺点2.6 与其他模式的关系 三、示例代码3.1 go3.2 rust 策略模式是一种行为设计模式&#xff0c;它能定义一系列算法&#xff0c;把每种算法分别放入独立的类中&#xff0c;以是…

《隐私计算简易速速上手小册》第4章:技术挑战与解决方案(2024 最新版)

文章目录 4.1 隐私计算中的技术难题4.1.1 基础知识4.1.2 重点案例:同态加密在金融数据分析中的应用4.1.3 拓展案例 1:安全多方计算在医疗数据共享中的应用4.1.4 拓展案例 2:差分隐私在社交媒体分析中的应用4.2 数据加密与解密的挑战4.2.1 基础知识4.2.2 重点案例:加密的在线…

防止被恶意调用API接口

前言 在面试时&#xff0c;经常会被问一个问题&#xff1a;如何防止别人恶意刷接口&#xff1f; 这是一个非常有意思的问题&#xff0c;防范措施挺多的。今天这篇文章专门跟大家一起聊聊&#xff0c;希望对你会有所帮助。 1 防火墙 防火墙是网络安全中最基本的安全设备之一&…

DAP下载程序(在MDK上配置DAP)以及程序调试(Keil uVision5软件的使用)

目录 1. 在MDK上配置DAP 2. 了解不同开发板不同的下载算法 3. DAP调试程序 3.1 JTAG/SWD调试原理概述 3.2 基础执行控制按钮 3.3 查看程序段/函数执行时间 3.4 结束仿真报错解决方法 3.5 工具栏常用窗口按钮介绍 3.5.1 Call Stack窗口&#xff1a;查看函数调…

【激光SLAM】激光的前端配准算法

文章目录 ICP匹配方法&#xff08;Point to Point&#xff09;PL-ICP匹配方法&#xff08;Point to Line&#xff09;基于优化的匹配方法&#xff08;Optimization-based Method&#xff09;优化方法的求解地图双线性插值拉格朗日插值法——一维线性插值 相关方法&#xff08;C…

HCIP-MGRE实验配置、PPP的PAP认证与CHAP认证、MGRE、GRE网络搭建、NAT

实验要求 R5为ISP,只能进行IP地址配素&#xff0c;其所有地址均为公有IP地址R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方 R2与R5之间使用PPP的chap认证&#xff0c;R5为主认证方 R3与R5之间使用HDLC封装。R1/R2/R3构建一个MGRE环境&#xff0c;R1为中心站点;R1、R4间为…

深入解析Android AIDL:实现跨进程通信的利器

深入解析Android AIDL&#xff1a;实现跨进程通信的利器 1. 介绍Android AIDL Android Interface Definition Language (AIDL) 是一种Android系统中的跨进程通信机制。AIDL允许一个应用程序的组件与另一个应用程序的组件通信&#xff0c;并在两者之间传输数据。 AIDL的主要作…

2024 VNCTF----misc---sqlshark sql盲注+流量分析

流量分析 wireshark 可以看到很多 any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(80))),1,0))# P any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(104))),1,0))#…

我的NPI项目之Android Camera (二) -- 核心部件之 Camera Sensor

说到Camera模组&#xff0c;我们比较关心的是用的什么样的sensor&#xff1f; sensor的分辨率多少&#xff0c;sensor的像素多大&#xff0c;sensor是哪家生产的等等一些问题。今天&#xff0c;我们就穿越时间&#xff0c;将sensor的历史扒一扒。 Wikipedia先看一下&#xff1…

初识 Rust 语言

目录 前言一、Rust 的背景二、Rust的特性三、部署开发环境&#xff0c;编写一个简单demo1、在ubuntu 20.04部署环境2、编写demo测试 四、如何看待Linux内核引入Rust 前言 自Linux 6.1起&#xff0c;初始的Rust基础设施被添加到Linux内核中。此后为了使内核驱动程序能够用Rust编…

C++--Linux基础使用

文章目录 几个简单命令开机关机重启查看当前目录切换当前目录列出当前目录下的目录和文件列出指定目录下的目录和文件清屏查看/设置时间 目录和文件目录概要目录详细说明相对路径和绝对路径 上古神器vi创建/打开文件vi 的两种模式vi 的常用命令 用户管理组管理用户管理修改用户…

小迪安全25WEB 攻防-通用漏洞SQL 读写注入MYSQLMSSQLPostgreSQL

#知识点&#xff1a; 1、SQL 注入-MYSQL 数据库 2、SQL 注入-MSSQL(SQL server) 数据库 3、SQL 注入-PostgreSQL 数据库 #详细点&#xff1a; Access 无高权限注入点-只能猜解&#xff0c;还是暴力猜解 因为access的数据库是独立存在的&#xff0c;不存在统一管理 …

应用回归分析:多重共线性

多重共线性的概念 在回归分析中&#xff0c;我们通常关注的是如何利用一个或多个自变量&#xff08;解释变量&#xff09;来预测一个因变量&#xff08;响应变量&#xff09;。当我们使用多元线性回归模型时&#xff0c;理想的情况是模型中的每一个自变量都能提供独特的、对因…

Cesium 问题——加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

5、Linux 常用指令

一、帮助指令 1.man 指令 语法 man [命令或配置文件] //功能描述&#xff1a;获得帮助手册上的信息查看 ls 命令的帮助信息 man ls信息作用NAME命令名称SYNOPSIS如何使用命令DESCRIPTION描述命令SEE ALSO相关的手册 2.help 指令 语法 help [命令] //功能描述&#xff1a;获得…