cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Trigger a Cron Job only once via Java code

Former Member
0 Likes
3,143

Hi,

I'm trying to schedule a cronjob via Java code. Our case is that when I can't st scheduled cronjob that I should postpone it for 30 minutes. I thought the following code should work, but it doesn't and I can't find any documentation about it.

Does someone of you have an idea to create a trigger that will only run once on a specific time?

 public void createTrigger(final CronJobModel cronJobModel) {    
     long t= new Date().getTime();
     Date afterAddingThirtyMins=new Date(t + (1800000));
     
     final TriggerModel triggerModel = modelService.create(TriggerModel.class);
     triggerModel.setActive(Boolean.TRUE);
     triggerModel.setActivationTime(afterAddingThirtyMins);
     triggerModel.setRelative(true);
     triggerModel.setCronJob(cronJobModel);
     modelService.save(triggerModel);
 }

I thought the code above should work, but the interval is now scheduled as daily while it should only run once.

Available method in TriggerModel:

  • setActivationTime(final Date value)

  • setActive(final Boolean value)

  • setCronExpression(final String value)

  • setCronJob(final CronJobModel value)

  • setDateRange(final StandardDateRange value)

  • setDay(final Integer value)

  • setDaysOfWeek(final List value)

  • setHour(final Integer value)

  • setJob(final JobModel value)

  • setMaxAcceptableDelay(final Integer value)

  • setMinute(final Integer value)

  • setMonth(final Integer value)

  • setRelative(final Boolean value)

  • setSecond(final Integer value)

  • setWeekInterval(final Integer value)

  • setYear(final Integer value)

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Likes

I finally found out that I should set every date field with the right value, the following code worked for me:

 private void createTrigger(final CronJobModel cronJobModel) {   
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(new Date());
         calendar.add(Calendar.MINUTE, 30);
         
         SimpleDateFormat sdf = new SimpleDateFormat("HH:mm dd-MM-yyyy");
         LOG.info("Cron job rescheduled to '" + sdf.format(calendar.getTime()) + "'");
         
         final TriggerModel triggerModel = modelService.create(TriggerModel.class);
         triggerModel.setActive(Boolean.TRUE);
         triggerModel.setRelative(Boolean.FALSE);
         
         triggerModel.setSecond(calendar.get(Calendar.SECOND)); 
         triggerModel.setMinute(calendar.get(Calendar.MINUTE));
         triggerModel.setHour(calendar.get(Calendar.HOUR_OF_DAY)); 
         triggerModel.setDay(calendar.get(Calendar.DAY_OF_MONTH)); 
         triggerModel.setMonth(calendar.get(Calendar.MONTH)); 
         triggerModel.setYear(calendar.get(Calendar.YEAR)); 
         triggerModel.setWeekInterval(0);
         
         triggerModel.setCronJob(cronJobModel);
         modelService.save(triggerModel);
     }
Former Member
0 Likes

Yes, I was just about to respond with a side-by-side comparison of Once and Daily, see image. 🙂

Answers (3)

Answers (3)

Former Member
0 Likes

I think the question is a bit confusing. For making a cron job run only once we have something called "singleExecutable" it will make the job run only once.

Former Member
0 Likes

Hi,

You can also use cronexpression to trigger a job once:

 triggerModel.setCronExpression("0 30 12 29 06 ? 2016");

to set a trigger on June 29th 2016 at 12:30 PM.

Former Member
0 Likes

You did not set "once" in your code.

Former Member
0 Likes

I know, which method should I use? Available methods:

setActivationTime(final Date value) setActive(final Boolean value) setCronExpression(final String value) setCronJob(final CronJobModel value) setDateRange(final StandardDateRange value) setDay(final Integer value) setDaysOfWeek(final List value) setHour(final Integer value) setJob(final JobModel value) setMaxAcceptableDelay(final Integer value) setMinute(final Integer value) setMonth(final Integer value) setRelative(final Boolean value) setSecond(final Integer value) setWeekInterval(final Integer value) setYear(final Integer value)