Quartz XML - 单个触发器,多个作业,作业数据映射

时间:2014-11-10 14:57:45

标签: java quartz-scheduler

有一个简单的石英配置问题,这对我不起作用。我有一个简单的" HitUrl" job,我想在xml中创建两个触发器,将不同的URL传递给作业。不幸的是,当尝试访问Job中传递的值(在Java中)时,返回null。

XML配置     

<job-scheduling-data
    xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd"
    version="1.8">

    <schedule>

        <!-- Executes Hit URL Standard Job -->
        <job>
            <name>HitURL</name>
            <group>DEFAULT</group>
            <job-class>standardjobs.HitUrl</job-
        </job>

        <trigger>
            <cron>
                <name>HitFirstURL</name>
                <group>DEFAULT</group>
                <job-name>HitURL</job-name>                
                <job-data-map>
                    <entry>
                        <key>url</key>
                        <value>itworked</value>
                    </entry>
                </job-data-map>                   
                <cron-expression>0 0/1 * 1/1 * ? *</cron-expression>                
            </cron>
        </trigger>

    </schedule>

</job-scheduling-data>

Java代码

package standardjobs;

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

public class HitUrl implements Job {

    @Override
    public void execute(final JobExecutionContext ctx) throws JobExecutionException {
        System.out.println("================= HIT URL EXECUTING ======================="); 

        //Retrieve the URL keypair from the job data map
        JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap();        
        String url = jobDataMap.getString("url");

        System.out.println("Hitting url "+url); //Just says "Hitting url: null"

    }

}

我在这里出错的任何想法?

2 个答案:

答案 0 :(得分:2)

我认为问题在于,当您在触发级别实际定义参数时,您正尝试从JobDetail的作业数据映射中提取URL参数值。

您应该使用传递的JobExecutionContext实例中定义的getMergedJobDataMap方法。请参阅相关的JobExecutionContext JavaDoc

答案 1 :(得分:1)

感谢你的答复Jan - 你肯定是在正确的路线上。我通过更改java代码修复它,如下所示:

旧代码

JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap();

新代码

JobDataMap jobDataMap = ctx.getTrigger().getJobDataMap();