2016-12-09 6 views
0

Я использую 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()); 
} 

}

ответ

1

Поскольку я не могу комментировать, добавлять его в качестве ответа

Любая причина, почему вы не используете JDBC-JobStoreTX

JDBCJobStore используется для хранения информации о планировании (задания, триггеры и календари) в реляционной базе данных. На самом деле существуют два отдельных класса JDBCJobStore, которые вы можете выбрать между ними, в зависимости от поведения транзакций, которое вам нужно.

JobStoreTX управляет всеми транзакциями, вызывая commit() (или rollback()) при подключении к базе данных после каждого действия (например, добавление задания). JDBCJobStore подходит, если вы используете Quartz в автономном приложении или в контейнере сервлета, если приложение не использует транзакции JTA.

Таким образом, вы можете сохраняться данные, которые вы хотите JobDataMap

Содержит информацию о состоянии для экземпляров задания.

экземпляры JobDataMap сохраняются один раз, когда задание добавляется в планировщик. Они также сохраняются после каждого выполнения заданий, аннотированных с помощью @PersistJobDataAfterExecution.

экземпляры JobDataMap также могут храниться с помощью триггера. Это может быть полезно в том случае, если у вас есть Job, которое хранится в планировщике для регулярного/повторного использования несколькими триггерами, но при каждом независимом запуске вы хотите предоставить Job с различными входами данных.

Идентификатор JobExecutionContext, переданный заданию во время выполнения, также содержит удобство JobDataMap, которое является результатом слияния содержимого JobDataMap запуска (если оно есть) над JobDataMap Job (если оно есть).

 Смежные вопросы

  • Нет связанных вопросов^_^