Я использую Spring MVC 4.2.5.RELEASE и кварц 2.2.1 кварцевых рабочие места 2.2.1Как начать снова Quartz рабочих мест, которые создаются динамически после завершения работы сервера
У меня есть пользовательский интерфейс, когда пользователь вводит имя и выражение хрон кварцевой работы, а затем создать работу, как этого
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
schedFact.getScheduler().getContext().put("externalInstanceEstatus", myObject);
Scheduler sched = schedFact.getScheduler();
sched.start();
JobDetail job = null;
job = newJob(MyTask.class)
.withIdentity((String) String.valueOf(myUniqueId), "group1")
.build();
Trigger triggerCron = TriggerBuilder
.newTrigger()
.withIdentity(String.valueOf(myUniqueId), "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(myObject.getExpresionCron()))
.build();
sched.scheduleJob(job, triggerCron);
Everytime, что пользователь выходит, что интерфейс, он может создать задание это работает отлично , но когда я выключить сервер все мои вакансии потеряны. Я решил эту проблему, сохранив имя работы и хрон выражение в базе данных, и я создал метод, извлекающих все записи из этой таблицы, и я заново создать рабочие места, как этот
public void reCreateJobs() {
ArrayList<MyJob> listOfJobs = searchAllJobsInDB();
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
//I loop the lsit and I delete all the jobs in the scheduler just in case
for (MyJob myJob : listOfJobs) {
for (String group : sched.getJobGroupNames()) {
for (JobKey jobKey : sched.getJobKeys((GroupMatcher<JobKey>) groupEquals(group))) {
if (jobKey.getName().equals(String.valueOf(myJob.getIdMyJob()))) {
sched.deleteJob(jobKey);
}
}
}
}
sched.start();
//THIS IS WHERE I CREATE ALL THE JOBS AGAIN
for (MyJob myJob : listOfJobs) {
JobDetail job = newJob(TareaImprimir.class)
.withIdentity((String) String.valueOf(myJob.getIdMyJob()), "group1")
.build();
JobDetail job = null;
Trigger triggerCron = TriggerBuilder
.newTrigger()
.withIdentity(String.valueOf(myJob.getIdMyJob()), "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(myJob.getExpresionCron()))
.build();
sched.scheduleJob(job, triggerCron);
}
}
Это также отлично работает я могу создать вакансии снова, и они работают нормально,
Моя проблема в том, что мне нужно передать значение классу задач, и я не знаю, как его передать, я знаю, как передать его, когда я создаю задание для в первый раз, как этот
schedFact.getScheduler().getContext().put("externalInstance", myObject);
, а затем я получаю его в своей задаче. Класс нравится это
SchedulerContext schedulerContext = null;
try {
schedulerContext = context.getScheduler().getContext();
} catch (SchedulerException ex) {
ex.printStackTrace();
}
MyObject externalInstance
= (MyObject) schedulerContext.get("externalInstance");
Моя проблема в том, что я не знаю, как это сделать, когда я воссоздании Работа в моем методе reCreateJobs()
где я получаю их от DataBase
Как я могу установить, что externalInstance внутри мой метод reCreateJobs()
для каждого задания или Как я могу передать это значение класса MyTask внутри этого цикла
это моя задача класса
public class MyTask implements Job {
@Autowired
SomeDAO someDAO;
public void execute(JobExecutionContext context)
throws JobExecutionException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
SchedulerContext schedulerContext = null;
try {
schedulerContext = context.getScheduler().getContext();
} catch (SchedulerException ex) {
Logger.getLogger(MyTask.class.getName()).log(Level.SEVERE, null, ex);
}
MyObject externalInstance
= (MyObject) schedulerContext.get("externalInstance");
someDAO.doSomething(externalInstance.getSomething());
}
}