2011-06-06 9 views
11

voglio aggiungere dinamicamente trigger per un posto di lavoro, ma non riesce a trovare alcun metodo utile al largo di pianificazioneAggiungi più trigger di lavoro quarzo singolo

io però vorrei solo essere in grado di chiamare il metodo ScheduleJob un ripetutamente, ma questo mi dà l'eccezione ObjectAlreadyExists "perché ne esiste già una con questo identificativo".

Come posso fare questo?

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; 
    } 
} 

Con Console di output

------ LoadJobs.Trigger-44

acquisizione lotto di 1 innesca

Producing istanza Job 'LoadJobs.Job-42', class = com.scheduling.LoadScheduleJob

Calling eseguire il lavoro LoadJobs.Job-42

acquisizione lotto di 1 innesca

lavoro richiedeva: 42: 44

------ LoadJobs.Trigger-45

Programmazione lavoro non riuscita per 42: 45 - 1/5 * *? * *

risposta

8

This post dà un suggerimento, ma la conclusione (schedulerInstance.add (trigger)) non è valida a partire dal quarzo 2.01.

Utilizzare invece la seguente, dopo assinging il lavoro al grilletto (solo andata sta usando il metodo forJob del TriggerBuilder)

schedulerInstance.scheduleJob(newTrigger) 
+0

Ciao Jake. Ho una lista di espressioni cron come def list = ["0 0/10 * * *?", "0 0/20 * * *?", "0 0/30 * * *?"] E voglio creare trigger in un loop come String triggerName; \t int j = 0; \t per (cronExpr in elenco) \t { \t j ++; \t \t \t TriggerName = "trigger" + 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); } e chiama il metodo execute() nel quarzo per tempi diversi con parametri diversi. Come posso avvicinarmi a questo? – elyon

1

È possibile chiamare scheduleJob ripetutamente. Assicurati di assegnare a ciascun trigger un nome/gruppo univoco.

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

+0

I trigger hanno nomi diversi. Ho perso parte dell'errore, si dice - Impossibile memorizzare Job: 'LoadJobs.Job-42', perché ne esiste già uno con questo identificativo, quindi sembra che il problema sia con il lavoro – rediVider

+0

Impossibile memorizzare Job: 'LoadJobs. Job-42 ', perché ne esiste già una con questa identificazione. – 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);