13

I want to dynamically add triggers to a job, but can't find any helpful methods off of Scheduler

I though i would just be able to call the scheduleJob method an repetitively, but this gives me tthe ObjectAlreadyExists Exception "because one already exists with this identification".

How can i do this?

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

With Console Output

------ LoadJobs.Trigger-44

batch acquisition of 1 triggers

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

Calling execute on job LoadJobs.Job-42

batch acquisition of 1 triggers

Job called for: 42 : 44

------ LoadJobs.Trigger-45

Job scheduling failed for 42 : 45 - 1/5 * * ? * *

STW
  • 44,917
  • 17
  • 105
  • 161
rediVider
  • 1,266
  • 2
  • 13
  • 30

3 Answers3

10

This post gives a hint, but the conclusion ( schedulerInstance.add(trigger) ) is not valid as of Quartz 2.01.

Instead use the following, after assinging the job to the trigger ( one way is using the TriggerBuilder's forJob method )

 schedulerInstance.scheduleJob( newTrigger )
Jake Roberts
  • 316
  • 1
  • 3
  • Hi Jake.I have a list of cron expressions like def list = ["0 0/10 * * * ?","0 0/20 * * * ?","0 0/30 * * * ?"] and i want to create triggers in a loop like String triggerName; int j=0; for(cronExpr in list) { j++; triggerName="trigger"+Integer.toString(j) triggerName = new CronTrigger(); triggerName.setName(triggerName); triggerName.setGroup(job.getGroup()); triggerName.setJobName(job.getName()); triggerName.setCronExpression(cronExpr); } and call execute() method in quartz for different time with different parameters.how do i approach this ? – elyon Jan 07 '15 at 19:29
6
    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);
Anil Kumar
  • 1,431
  • 3
  • 13
  • 14
  • Strangely enough but `scheduler.addJob(job, true, true)` preserves existing triggers of the job (and so there misfires)! – Ilya Serbis Aug 15 '18 at 11:33
1

You can call scheduleJob repeatedly. Just make sure that you give each Trigger a unique name/group.

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

Jeremy Haile
  • 136
  • 6
  • The triggers have different names. I missed part of the error, it says - Unable to store Job : 'LoadJobs.Job-42', because one already exists with this identification, so it looks like the problem is with the job – rediVider Jun 06 '11 at 21:37
  • Unable to store Job : 'LoadJobs.Job-42', because one already exists with this identification. – rediVider Jun 06 '11 at 21:41
  • please, provide code sample to your answer because it's not clear which override of `scheduleJob()` you suggest to use. – Ilya Serbis Aug 15 '18 at 11:14