Как передать переменные экземпляра в работу Quartz?
Интересно, как передать переменную экземпляра извне в Quartz?
Ниже приведен псевдокод, который я хотел бы написать. Как я могу передать externalInstance в это задание?
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
float avg = externalInstance.calculateAvg();
}
}
Ответы
Ответ 1
Вы можете поместить свой экземпляр в 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 для добавления всего контекста applicationContext, как указано в ссылке.
Ответ 2
При планировании задания с помощью триггера вы бы определили JobDataMap
, который добавлен в JobDetail
. Этот объект JobDetail будет присутствовать в JobExecutionContext
, переданном методу execute()
в вашем Job
. Итак, вы должны выяснить способ передачи своего внешнего события через JobDataMap
. НТН.
Ответ 3
Решите эту проблему, создав один интерфейс с одним HashMap
, разместив там необходимую информацию.
Внедрите этот интерфейс в свой класс Quartz Job
, эта информация будет доступна.
В IFace
Map<JobKey,Object> map = new HashMap<>();
В Job
map.get(context.getJobDetail().getKey()) => will give you Object
Ответ 4
Это ответственность JobFactory
. Реализация по умолчанию PropertySettingJobFactory
будет вызывать любые методы bean -setter, основанные на свойствах, найденных в контексте schdeuler, триггере и задаче. Поэтому, пока вы применили подходящий метод set setContext()
, вы сможете выполнить любое из следующих действий:
scheduler.getContext().put("context", context);
или
Trigger trigger = TriggerBuilder.newTrigger()
...
.usingJobData("context", context)
.build()
или
JobDetail job = JobBuilder.newJob(SimpleJob.class)
...
.usingJobData("context", context)
.build()
Или, если этого недостаточно, вы можете предоставить свой собственный класс JobFactory
, который, тем не менее, создает экземпляры объекта Job.
Ответ 5
Добавьте объект в JobDataMap:
JobDetail job = JobBuilder.newJob(MyJobClass.class)
.withIdentity("MyIdentity",
"MyGroup")
.build();
job.getJobDataMap()
.put("MyObject",
myObject);
Доступ к данным из JobDataMap:
var myObject = (MyObjectClass) context.getJobDetail()
.getJobDataMap()
.get("carrier");