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

任务调度执行原理图:

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一样的话,后者会覆盖前者的值。

关键部分修改:

结果

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜小白也想的美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值