gpt4 book ai didi

java - 如何更新 Quartz JobDataMap 中的值?

转载 作者:搜寻专家 更新时间:2023-10-31 08:10:27 26 4
gpt4 key购买 nike

我正在使用 quartz-scheduler 1.8.5。我创建了一个实现 StatefulJob 的工作。我使用 SimpleTrigger 和 StdSchedulerFactory 安排作业。

除了 JobDetail 的 JobDataMap 之外,我似乎还必须更新 Trigger 的 JobDataMap 才能从作业内部更改 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 的 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?

最佳答案

我认为您的问题在于使用后缀++ 运算符 - 当您这样做时:

context.getJobDetail().getJobDataMap().put("count", count++);  

您正在将 map 中的值设置为计数,然后递增计数。

在我看来你想要的是:

context.getJobDetail().getJobDataMap().put("count", ++count);  

这只需要做一次。

关于java - 如何更新 Quartz JobDataMap 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5835442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com