Quartz JobDataMapには次の問題があります。単純な Quartz Jobを使用し、プリミティブでないオブジェクト ( StringBuilderのインスタンスなど) をJobDateMapに渡す場合、メソッドexecute (私のジョブから) は常に、入れたオブジェクトの別のコピーで呼び出される必要があります。残念ながら、 JobDateMapに入れたオブジェクトのインスタンスを常に取得します(StatefulJob のように)。
次の例では、呼び出しごとに単一の「*」を取得することを期待していますが、毎回「*」をもう 1 つ取得します。
public class MyJob implements Job {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
JobDetail jobDetail = new JobDetail("job", Scheduler.DEFAULT_GROUP, MyJob.class);
jobDetail.getJobDataMap().put("param", new StringBuilder());
Trigger trigger = TriggerUtils.makeImmediateTrigger("trigger", 10, 100);
trigger.setGroup(Scheduler.DEFAULT_GROUP);
sched.scheduleJob(jobDetail, trigger);
sched.start();
try {
Thread.sleep(1000L);
} catch (Exception e) {}
sched.shutdown(true);
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
StringBuilder sb = (StringBuilder) context.getMergedJobDataMap().get("param");
sb.append("*");
System.out.println(sb.toString());
}
}
Quartz がどのように機能しているかについて、何かが欠けていると思います。誰でも何を知っていますか?