2011-06-06 16 views
11

Chcę dynamicznie dodać wyzwalaczy do pracy, ale nie może znaleźć żadnych pomocnych metod off SchedulerDodaj wiele wyzwalaczy do pojedynczego zadania kwarcowym

I choć chciałbym po prostu móc wywołać metodę scheduleJob powtarzalnie, ale to daje mi wyjątek ObjectAlreadyExists ", ponieważ już istnieje z tą identyfikacją".

Jak mogę to zrobić?

EDIT

private boolean scheduleLoadJob(XfuScheduleTimeInfo time) 
{ 
    LoadScheduleJob job = new LoadScheduleJob(time); 
    JobDetail detail; 

    Integer id = Integer.valueOf(time.getScheduleId()); 
    if(_hashMap.containsKey(id)) 
    { 
     detail = _hashMap.get(Integer.valueOf(time.getScheduleId())); 
    } 
    else 
    { 
     detail = job.getDetail(); 
     _hashMap.put(id, detail); 
    } 

    try 
    { 
     Trigger newTrigger = job.getTrigger(); 
     _log.debug("------" + newTrigger.getKey()); 
     _quartzScheduler.scheduleJob(detail, newTrigger); 
     return true; 
    } 
    catch(ParseException e) 
    { 
     _log.error("Unable to parse cron expression for " + job.getInfo()); 
     return false; 
    } 
    catch(SchedulerException e) 
    { 
     _log.error("Job scheduling failed for " + job.getInfo()); 
     return false; 
    } 
} 

z wyjściem konsoli

------ LoadJobs.Trigger-44

nabycia partia 1 powoduje

Wytwarzanie wystąpienie Zadanie "LoadJobs.Job-42", class = com.scheduling.LoadScheduleJob

Wywołanie wykonać na pracy LoadJobs.Job-42

nabycie partia 1 wyzwala

Job wezwał: 42: 44

------ LoadJobs.Trigger-45

Harmonogram zadań nie powiódł się dla 42: 45 - 1/5 * *? * *

Odpowiedz

8

This post daje wskazówkę, ale konkluzja (schedulerInstance.add (wyzwalacz)) nie jest ważny jako kwarcu 2.01.

Zamiast używać następujących po assinging zadanie do spustu (jeden ze sposobów jest użycie metody forJob w TriggerBuilder za)

schedulerInstance.scheduleJob(newTrigger) 
+0

Cześć Jake. Mam listę wyrażeń crona, takich jak lista def = ["0 0/10 * * *?", "0 0/20 * * *?", "0 0/30 * * *?"] I Chcę utworzyć wyzwalacze w pętli jak String triggerName; \t int j = 0; \t dla (cronExpr na liście) \t { \t j ++; \t \t \t triggerName = "wyzwalania" + Integer.toString (j) \t \t \t triggerName = new CronTrigger(); \t \t \t triggerName.setName (triggerName); \t \t \t triggerName.setGroup (job.getGroup()); \t \t \t triggerName.setJobName (job.getName()); \t \t \t triggerName.setCronExpression (cronExpr); } i wywołaj metodę execute() w kwarcu dla różnych czasów o różnych parametrach. Jak mam to podejść? – elyon

1

Możesz wywołać funkcję scheduleJob wielokrotnie. Upewnij się, że nadałeś każdemu wyzwalaczowi unikalną nazwę/grupę.

See TriggerBuilder.withIdentity: http://www.quartz-scheduler.org/docs/api/2.0.0/index.html

+0

Wyzwalacze mają różne nazwy. Opuściłem część błędu, mówi - Nie można zapisać zadania: "LoadJobs.Job-42", ponieważ już istnieje z tą identyfikacją, więc wygląda na to, że problem dotyczy zadania – rediVider

+0

Nie można zapisać zadania: "LoadJobs. Job-42 ', ponieważ już istnieje z tą identyfikacją. – rediVider

4
CronTrigger trigger=null; 
    CronTrigger trigger1=null; 
    CronTrigger trigger2=null; 

    JobDetail job = new JobDetail(); 
    job.setName("dummyJobName"); 
    job.setJobClass(ExampleJob.class); 

    trigger = new CronTrigger(); 
    trigger.setName("AppTrigger"); 
    trigger.setGroup(job.getGroup()); 
    trigger.setJobName(job.getName()); 
    trigger.setJobGroup(job.getGroup()); 
    trigger.setCronExpression("*/2 * * * * ?"); 

    trigger1 = new CronTrigger(); 
    trigger1.setName("AppTrigger1"); 
    trigger1.setGroup(job.getGroup()); 
    trigger1.setJobName(job.getName()); 
    trigger1.setJobGroup(job.getGroup()); 
    trigger1.setCronExpression("*/2 * * * * ?"); 

    trigger2 = new CronTrigger(); 
    trigger2.setName("AppTrigger2"); 
    trigger2.setGroup(job.getGroup()); 
    trigger2.setJobName(job.getName()); 
    trigger2.setJobGroup(job.getGroup()); 
    trigger2.setCronExpression("*/2 * * * * ?"); 

    Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 

    scheduler.start(); 
    scheduler.addJob(job, true); 
    scheduler.scheduleJob(trigger); 
    scheduler.scheduleJob(trigger1); 
    scheduler.scheduleJob(trigger2); 
Powiązane problemy