Quartzでインスタンス変数を外部に渡す方法はありますか?
以下は、書きたい擬似コードです。このジョブにexternalInstanceを渡すにはどうすればよいですか?
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
float avg = externalInstance.calculateAvg();
}
}
インスタンスをschedulerContextに配置できます。ジョブをスケジュールするときは、その直前に以下を実行できます。
getScheduler().getContext().put("externalInstance", externalInstance);
あなたの職種は以下のようになります:
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
SchedulerContext schedulerContext = null;
try {
schedulerContext = context.getScheduler().getContext();
} catch (SchedulerException e1) {
e1.printStackTrace();
}
ExternalInstance externalInstance =
(ExternalInstance) schedulerContext.get("externalInstance");
float avg = externalInstance.calculateAvg();
}
}
Springを使用している場合、実際にはspringのサポートを使用して、 Link
トリガーを使用してジョブをスケジュールするときに、JobDataMap
に追加されるJobDetail
を定義します。そのJobDetailオブジェクトは、JobExecutionContext
のexecute()
メソッドに渡されるJob
に存在します。したがって、JobDataMap
を介してexternalInstanceを渡す方法を理解する必要があります。 HTH。
この問題を解決するには、必要な情報を1つのHashMap
に配置して1つのインターフェイスを作成します。
Quartz Job
クラスにこのインターフェイスを実装し、この情報にアクセスできるようにします。
IFace
Map<JobKey,Object> map = new HashMap<>();
Job
map.get(context.getJobDetail().getKey()) => will give you Object
これはJobFactory
の責任です。デフォルトのPropertySettingJobFactory
実装は、Schdeulerコンテキスト、トリガー、およびジョブの詳細にあるプロパティに基づいて、Beanセッターメソッドを呼び出します。したがって、適切なsetContext()
setterメソッドを実装している限り、次のいずれかを実行できるはずです。
scheduler.getContext().put("context", context);
または
Trigger trigger = TriggerBuilder.newTrigger()
...
.usingJobData("context", context)
.build()
または
JobDetail job = JobBuilder.newJob(SimpleJob.class)
...
.usingJobData("context", context)
.build()
または、それだけでは不十分な場合は、Jobオブジェクトをインスタンス化する独自のJobFactory
クラスを提供できます。