Quartz教程 - 3传递参数

本文介绍了如何在Quartz框架中创建Job和Trigger时传递参数,以及如何在Job中通过JobDataMap和属性接收这些参数。重点讲解了JobDataMap的使用和参数覆盖机制。
摘要由CSDN通过智能技术生成

更好的阅读体验:点这里www.foooor.com

3 传递参数

如果我们想在创建任务和触发器的时候,给任务传递一些参数,在执行任务的时候,可以读取到这些参数,那么该如何处理呢?

这里就需要用到 JobDataMap

3.1 传递参数

我们可以在创建 Job 或 Trigger 的时候,设置参数。

举个栗子:

// 1.定义jobDetail
JobDetail job = JobBuilder.newJob(MyJob.class)
        .withIdentity("job1", "jGroup1")
        .usingJobData("name", "Doubibiji")           // 通过key-value形式设置参数
        .usingJobData("description", "job的参数")		 // 通过key-value形式设置参数
        .build();

// 2.定义触发器
Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("trigger1", "tGroup1")
        .usingJobData("year", 2024)                 	// 通过key-value形式设置参数
        .usingJobData("description", "trigger的参数")	// 通过key-value形式设置参数
        // 立刻执行
        .startNow()
        // 触发策略,用简单的触发策略,就是按照时间间隔执行
        .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                // 5秒执行一次
                .withIntervalInSeconds(1)
                // 一直重复
                .repeatForever())
        .build();

在创建 Job 或 Trigger 的时候,都可以通过 JobDataMap 以 key-value 的形式设置参数,这是因为 JobDataMap 实现了 JDK 中的 Map 接口。

下面就可以来获取上面传递的参数了。

3.1 接收参数

接收参数有两种方式,一种是在 Job 中获取到 JobDataMap 对象,通过 JobDataMap 获取参数。一种是通过 Job 中的属性来接收参数。


1 通过 JobDataMap 获取参数

在 Job 类中的 execute 方法中,通过 JobExecutionContext 对象可以获取到 JobDetail 和 Trigger,然后获取到 JobDataMap。

package com.doubibiji.job;

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

public class MyJob implements Job {

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

        System.out.println("--------");

        // 获取job传递的数据
        JobDataMap jobMap = jobExecutionContext.getJobDetail().getJobDataMap();
        System.out.println("name:" + jobMap.getString("name"));
        System.out.println("description:" + jobMap.getString("description"));

        // 获取trigger传递的数据
        JobDataMap triggerMap = jobExecutionContext.getTrigger().getJobDataMap();
        System.out.println("year:" + triggerMap.getInt("year"));
        System.out.println("description:" + triggerMap.getString("description"));


        // 也可以将job和trigger传递的参数合并后进行获取
        JobDataMap mergedMap = jobExecutionContext.getMergedJobDataMap();
        System.out.println("name:" + mergedMap.getString("name"));
        System.out.println("year:" + mergedMap.getInt("year"));
        System.out.println("description:" + mergedMap.getString("description"));
    }
}

JobExecutionContext 对象是任务执行的上下文对象,可以获取到全局的信息。可以通过 JobExecutionContext 对象获取到 JobDetail 和 Trigger 的信息,然后获取到 JobDataMap 的信息。

通过 getMergedJobDataMap() 可以获取 JobDetail 和 Trigger 传递的参数合并后的结果,如果传递参数的时候 JobDetail 和 Trigger 传递了相同的 key 值,那么 Trigger 中传递的参数会覆盖 JobDetail 中的参数。

执行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到合并后的信息,打印的 description 是 Trigger 传递的。

2 通过属性获取参数

首先在 Job 中定义与传递数据的时候 key 相同属性和 set 方法。

这样在创建 job 的时候,会通过 setter 将参数设置进来。

package com.doubibiji.job;

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

public class MyJob implements Job {

    // 需要与传递的key名称相同
    private String name;
    private int year;
    private String description;

    // 定义set方法
    public void setName(String name) {
        this.name = name;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("--------");

        // 获取到传递的数据
        System.out.println("name:" + name);
        System.out.println("year:" + year);
        System.out.println("description:" + description);
    }
}

这样看上去代码要简洁很多。

执行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山石岐渡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值