Как обновить значение в Quartz JobDataMap?

Я использую кварцевый планировщик 1.8.5. Я' Мы создали задание, реализующее StatefulJob. Я планирую задание с помощью SimpleTrigger и StdSchedulerFactory.

Похоже, что мне нужно обновить JobDataMap триггера в дополнение к JobDataMap JobDetail, чтобы изменить JobDataMap изнутри задания. Пытаюсь понять, зачем обновлять оба? Я заметил, что для JobDataMap установлено значение «грязный». Может, мне нужно явно сохранить это или что-то в этом роде?

Я думаю, мне придется покопаться в исходном коде Quartz, чтобы действительно понять, что здесь происходит, но я подумал, что поленился бы сначала спросить. Спасибо за понимание внутренней работы JobDataMap!

Вот моя работа:

public class HelloJob implements StatefulJob {

    public HelloJob() {
    }

    public void execute(JobExecutionContext context)
            throws JobExecutionException {

        int count = context.getMergedJobDataMap().getInt("count");
        int count2 = context.getJobDetail().getJobDataMap().getInt("count");
        //int count3 = context.getTrigger().getJobDataMap().getInt("count");
        System.err.println("HelloJob is executing. Count: '"+count+"', "+count2+"'");

        //The count only gets updated if I updated both the Trigger and 
                // JobDetail DataMaps. If I only update the JobDetail, it doesn't persist. 
        context.getTrigger().getJobDataMap().put("count", count++);
        context.getJobDetail().getJobDataMap().put("count", count++);

        //This has no effect inside the job, but it works outside the job
        try {
            context.getScheduler().addJob(context.getJobDetail(), true);
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //These don't seem to persist between jobs
        //context.put("count", count++);
        //context.getMergedJobDataMap().put("count", count++);
    }
}

Вот как я планирую задание:

try {
    // define the job and tie it to our HelloJob class
    JobDetail job = new JobDetail(JOB_NAME, JOB_GROUP_NAME,
            HelloJob.class);
    job.getJobDataMap().put("count", 1);
    // Trigger the job to run now, and every so often
    Trigger trigger = new SimpleTrigger("myTrigger", "group1",
            SimpleTrigger.REPEAT_INDEFINITELY, howOften);

    // Tell quartz to schedule the job using our trigger
    sched.scheduleJob(job, trigger);
    return job;
} catch (SchedulerException e) {
    throw e;
}

Обновление:

Кажется, мне нужно поместить значение в JobDetail's JobDataMap дважды, чтобы это продолжалось, это работает:

public class HelloJob implements StatefulJob {

    public HelloJob() {
    }

    public void execute(JobExecutionContext context)
            throws JobExecutionException {

        int count = (Integer) context.getMergedJobDataMap().get("count");
        System.err.println("HelloJob is executing. Count: '"+count+"', and is the job stateful? "+context.getJobDetail().isStateful());
        context.getJobDetail().getJobDataMap().put("count", count++);
        context.getJobDetail().getJobDataMap().put("count", count++);
    }
}

Может быть, это похоже на ошибку? Или, может быть, мне не хватает шага, чтобы сообщить JobDetail сбросить содержимое его JobDataMap в JobStore?

5
задан thesquaregroot 1 October 2015 в 19:47
поделиться