Подтвердить что ты не робот

Как передать переменные экземпляра в работу Quartz?

Интересно, как передать переменную экземпляра извне в Quartz?

Ниже приведен псевдокод, который я хотел бы написать. Как я могу передать externalInstance в это задание?

public class SimpleJob implements Job {
        @Override
        public void execute(JobExecutionContext context)
                throws JobExecutionException {

            float avg = externalInstance.calculateAvg();
        }
}
4b9b3361

Ответ 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");