2011-06-06 9 views
11

Quiero añadir dinámicamente disparadores para un trabajo, pero no se encuentra ninguna métodos votos fuera del Programadorañadir varios disparadores de trabajo de cuarzo sola

I aunque sólo sería capaz de llamar al método ScheduleJob una forma repetitiva, pero esto me da la Excepción de ObjectAlreadyExists "porque uno ya existe con esta identificación".

¿Cómo puedo hacer esto?

EDITAR

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 Salida de consola

------ LoadJobs.Trigger-44

adquisición lote de 1 desencadena

Producir instancia de Trabajo 'LoadJobs.Job-42', class = com.scheduling.LoadScheduleJob

Calling ejecutar el trabajo LoadJobs.Job-42

adquisición de lote de 1 desencadena

Trabajo pidió: 42: 44

------ LoadJobs.Trigger-45

¿Error al programar el trabajo para 42: 45 - 1/5 * *? * *

Respuesta

8

This post da una pista, pero la conclusión (schedulerInstance.add (disparador)) no es válida a partir del cuarzo 2.01.

En lugar de utilizar la siguiente, después de assinging el trabajo al disparador (Una forma es utilizar el método de la forJob TriggerBuilder)

schedulerInstance.scheduleJob(newTrigger) 
+0

Hola Jake. Tengo una lista de expresiones cron como def list = ["0 0/10 * * *?", "0 0/20 * * *?", "0 0/30 * * *?"] Y quiero crear desencadenantes en un bucle como String triggerName; \t int j = 0; \t para (cronExpr en la lista) \t { \t j ++; \t \t \t triggerName = "disparador" + 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); } y el método call execute() en cuarzo para diferentes tiempos con diferentes parámetros. ¿Cómo me acerco a esto? – elyon

1

Puede llamar a scheduleJob repetidamente. Solo asegúrate de darle a cada Trigger un nombre/grupo único.

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

+0

Las causas no tienen nombres diferentes. Me perdí parte del error, dice: "No se puede almacenar el trabajo: 'LoadJobs.Job-42', porque ya existe uno con esta identificación, por lo que parece que el problema es con el trabajo – rediVider

+0

No se puede almacenar el trabajo: 'LoadJobs. Job-42 ', porque uno ya existe con esta identificación. – 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); 
Cuestiones relacionadas