Quartz 定时任务执行传递参数信息

在 Quartz 中,你可以通过作业(Job)的上下文来传递和访问定时任务的参数信息。Quartz 提供了多种方式来设置和获取这些参数,这通常涉及到 JobDataMap,它允许你向 Job 传递数据。

设置参数

当你调度一个 Job 时,可以使用 JobDetail 或者 Trigger 来添加参数。以下是两种常见的方式:

使用 JobDetail 设置参数

JobDetail job = JobBuilder.newJob(MyJob.class)
    .withIdentity("job1", "group1")
    .usingJobData("jobSays", "Hello World!")
    .usingJobData("myFloatValue", 3.141f)
    .build();

或者使用 Trigger 设置参数

Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("trigger1", "group1")
    .startNow()
    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
        .withIntervalInSeconds(40)
        .repeatForever())
    .usingJobData("triggerKey", "triggerValue")
    .build();

参考设置:

    protected void scheduleJob(QuartzEntity quartzEntity){
        Long tenantId = quartzEntity.getTenantId();
        String classname = quartzEntity.getClassname();
        String jobName = quartzEntity.getName();
        String group = quartzEntity.getGroup();
        String descr = quartzEntity.getDescr();
        String cronexpre = quartzEntity.getCronexpre();
        String identityJob = jobName+tenantId;

        try {
            Class cls = Class.forName(classname);
            cls.newInstance();
            //构建job信息
            JobDetail job = JobBuilder.newJob(cls)
                    .withIdentity(identityJob,group)
                    .withDescription(descr)
                    .usingJobData("tenantId", tenantId)
                    .build();
            // 触发时间点
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronexpre);
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger" + identityJob,group)
                    .startNow()
                    .withSchedule(cronScheduleBuilder)
                    .build();
            //交由Scheduler安排触发
            scheduler.scheduleJob(job, trigger);
            log.info("任务开启:{}-{}", group, identityJob);
            if("0".equals(quartzEntity.getTristate())){
                JobKey key = getJobKey(quartzEntity);
                scheduler.pauseJob(key);
                log.info("任务暂停:{}-{}", group, identityJob);
            }
        }catch (Exception e){
            log.error("任务触发失败:{}-{}", group, identityJob);
        }
    }

获取参数

在你的 Job 实现中,可以通过 JobExecutionContext 访问这些参数。以下是一个示例:

public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobKey key = context.getJobDetail().getKey();

        // 获取 JobDetail 中的参数
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();
        String jobSays = dataMap.getString("jobSays");
        float myFloatValue = dataMap.getFloat("myFloatValue");

        // 获取 Trigger 中的参数
        JobDataMap triggerDataMap = context.getTrigger().getJobDataMap();
        String triggerKey = triggerDataMap.getString("triggerKey");

        // 合并后的 JobDataMap,优先级:触发器 > 作业详情
        JobDataMap mergedDataMap = context.getMergedJobDataMap();
        String mergedValue = mergedDataMap.getString("jobSays"); // 可能来自 JobDetail 或 Trigger

        System.out.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
    }
}

注意事项

  • 当同时在 JobDetail 和 Trigger 中设置了相同的键值对时,Trigger 中的数据会覆盖 JobDetail 中的数据。
  • 使用 context.getMergedJobDataMap() 可以获得合并后的 JobDataMap,其中包含了从 JobDetail 和 Trigger 中的所有数据,并且如果有重复键的话,Trigger 的值会覆盖 JobDetail 的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值