public Date hasNextFireTime() { Date date = orig.hasNextFireTime(); if (date == null) { return null; } long then = date.getTime(); long now = kruntime.getSessionClock().getCurrentTime(); // overdue timer if (then < now) { return new Date((now + OVERDUE_DELAY)); } else { return orig.hasNextFireTime(); } }
@Override public void internalSchedule(TimerJobInstance timerJobInstance) { if (scheduler.isShutdown()) { return; } Date date = timerJobInstance.getTrigger().hasNextFireTime(); Callable<Void> item = (Callable<Void>) timerJobInstance; GlobalJDKJobHandle jobHandle = (GlobalJDKJobHandle) timerJobInstance.getJobHandle(); long then = date.getTime(); long now = System.currentTimeMillis(); ScheduledFuture<Void> future = null; if ( then >= now ) { future = scheduler.schedule( new RetriggerCallable(scheduler, item), then - now, TimeUnit.MILLISECONDS ); } else { future = scheduler.schedule( new RetriggerCallable(scheduler, item), 0, TimeUnit.MILLISECONDS ); } jobHandle.setFuture( future ); globalTimerService.getTimerJobFactoryManager().addTimerJobInstance( timerJobInstance ); }
@Override public JobHandle scheduleJob(Job job, JobContext ctx, Trigger trigger) { Date date = trigger.hasNextFireTime(); if ( date != null ) { String jobname = null;
Date nextFireTime = timerJobInstance.getTrigger().hasNextFireTime(); Date threshold = new Date(System.currentTimeMillis() + RESCHEDULE_DELAY); if (nextFireTime.before(threshold)) {
if (ctx.getTrigger().hasNextFireTime() == null) { ctx.getTimer().setPeriod(0);
public void deserialize(MarshallerReaderContext inCtx, Timer timer) throws ClassNotFoundException { JBPMMessages.ProcessTimer ptimer = timer.getExtension(JBPMMessages.procTimer); TimerService ts = inCtx.wm.getTimerService(); long processInstanceId = ptimer.getTimer().getProcessInstanceId(); Trigger trigger = ProtobufInputMarshaller.readTrigger(inCtx, ptimer.getTrigger()); TimerInstance timerInstance = ProtobufProcessMarshaller.readTimer(inCtx, ptimer.getTimer()); TimerManager tm = ((InternalProcessRuntime) inCtx.wm.getProcessRuntime()).getTimerManager(); // check if the timer instance is not already registered to avoid duplicated timers if (!tm.getTimerMap().containsKey(timerInstance.getId())) { ProcessJobContext pctx = new ProcessJobContext(timerInstance, trigger, processInstanceId, inCtx.wm.getKnowledgeRuntime(), false); Date date = trigger.hasNextFireTime(); if (date != null) { long then = date.getTime(); long now = pctx.getKnowledgeRuntime().getSessionClock().getCurrentTime(); // overdue timer if (then < now) { trigger = new OverdueTrigger(trigger, pctx.getKnowledgeRuntime()); } } JobHandle jobHandle = ts.scheduleJob(processJob, pctx, trigger); timerInstance.setJobHandle(jobHandle); pctx.setJobHandle(jobHandle); tm.getTimerMap().put(timerInstance.getId(), timerInstance); } } }
if (ctx.getTrigger().hasNextFireTime() == null) { ctx.getTimer().setPeriod(0);
@Test public void removeExistingJob() { final Date triggerTime = new Date(1000); when( mockTrigger_1.hasNextFireTime() ).thenReturn(triggerTime); JobHandle jobHandle = scheduler.scheduleJob(mockJob_1, this.mockContext_1, mockTrigger_1); assertThat(scheduler.getTimeToNextJob(), is(triggerTime.getTime())); scheduler.removeJob(jobHandle); assertThat(scheduler.getTimeToNextJob(), is(-1L)); verify( mockTrigger_1, atLeastOnce()).hasNextFireTime(); }
@Test public void removeExistingJobWhenMultipleQueued() { final Date triggerTime_1 = new Date(1000); final Date triggerTime_2 = new Date(2000); when( mockTrigger_1.hasNextFireTime() ).thenReturn(triggerTime_1); when( mockTrigger_2.hasNextFireTime() ).thenReturn(triggerTime_2); JobHandle jobHandle_1 = scheduler.scheduleJob(mockJob_1, this.mockContext_1, mockTrigger_1); JobHandle jobHandle_2 = scheduler.scheduleJob(mockJob_2, this.mockContext_2, mockTrigger_2); assertThat(scheduler.getTimeToNextJob(), is(triggerTime_1.getTime())); scheduler.removeJob(jobHandle_1); assertThat(scheduler.getTimeToNextJob(), is(triggerTime_2.getTime())); scheduler.removeJob(jobHandle_2); assertThat(scheduler.getTimeToNextJob(), is(-1L)); verify( mockTrigger_1, atLeastOnce()).hasNextFireTime(); verify( mockTrigger_2, atLeastOnce()).hasNextFireTime(); }
@Test public void timerIsSetToJobTriggerTimeForExecution() { final Date triggerTime = new Date(1000); when( mockTrigger_1.hasNextFireTime() ).thenReturn(triggerTime, triggerTime, triggerTime, null); when( mockTrigger_1.nextFireTime() ).thenReturn(triggerTime); Job job = new Job() { public void execute(JobContext ctx) { // Even though the clock has been advanced to 5000, the job should run // with the time set its trigger time. assertThat(scheduler.getCurrentTime(), is(1000L)); } }; scheduler.scheduleJob(job, this.mockContext_1, mockTrigger_1); scheduler.advanceTime(5000, TimeUnit.MILLISECONDS); // Now, after the job has been executed the time should be what it was advanced to assertThat(scheduler.getCurrentTime(), is(5000L)); verify( mockTrigger_1, atLeast(2) ).hasNextFireTime(); verify( mockTrigger_1, times(1) ).nextFireTime(); }
@Test public void timerIsResetWhenJobThrowsExceptions() { final Date triggerTime = new Date(1000); when( mockTrigger_1.hasNextFireTime() ).thenReturn(triggerTime, triggerTime, triggerTime, null); when( mockTrigger_1.nextFireTime() ).thenReturn(triggerTime); Job job = new Job() { public void execute(JobContext ctx) { assertThat(scheduler.getCurrentTime(), is(1000L)); throw new RuntimeException("for test"); } }; scheduler.scheduleJob(job, this.mockContext_1, mockTrigger_1); scheduler.advanceTime(5000, TimeUnit.MILLISECONDS); // The time must be advanced correctly even when the job throws an exception assertThat(scheduler.getCurrentTime(), is(5000L)); verify( mockTrigger_1, atLeast(2) ).hasNextFireTime(); verify( mockTrigger_1, times(1) ).nextFireTime(); } }
@Test public void testJustMaxDuration() { CompositeMaxDurationTimer timer = new CompositeMaxDurationTimer(); timer.addDurationTimer( new DurationTimer( 25 ) ); timer.addDurationTimer( new DurationTimer( 50 ) ); timer.addDurationTimer( new DurationTimer( 70 ) ); Date timestamp = new Date(); Trigger trigger = timer.createTrigger( timestamp.getTime(), null, null, null, null, null, null ); assertEquals( new Date( timestamp.getTime() + 70 ), trigger.hasNextFireTime() ); assertNull( trigger.nextFireTime() ); assertNull( trigger.hasNextFireTime() ); }
@Test public void testMixedDurationAndTimer() { CompositeMaxDurationTimer timer = new CompositeMaxDurationTimer(); timer.addDurationTimer( new DurationTimer( 25 ) ); timer.addDurationTimer( new DurationTimer( 50 ) ); timer.addDurationTimer( new DurationTimer( 70 ) ); timer.setTimer( new IntervalTimer(null, null, 6, 40, 25) ); Date timestamp = new Date(); Trigger trigger = timer.createTrigger( timestamp.getTime(), null, null, null, null, null, null ); // ignores the first interval timer at 65 assertEquals( new Date( timestamp.getTime() + 70 ), trigger.hasNextFireTime() ); assertEquals( new Date( timestamp.getTime() + 90 ), trigger.nextFireTime() ); assertEquals( new Date( timestamp.getTime() + 115 ), trigger.nextFireTime() ); assertEquals( new Date( timestamp.getTime() + 140 ), trigger.nextFireTime() ); assertNull( trigger.nextFireTime() ); assertNull( trigger.hasNextFireTime() ); } }
public Date hasNextFireTime() { Date date = orig.hasNextFireTime(); if (date == null) { return null; } long then = date.getTime(); long now = kruntime.getSessionClock().getCurrentTime(); // overdue timer if (then < now) { return new Date((now + OVERDUE_DELAY)); } else { return orig.hasNextFireTime(); } }
public void internalSchedule(TimerJobInstance timerJobInstance) { TimerConfig config = new TimerConfig(new EjbTimerJob(timerJobInstance), true); Date expirationTime = timerJobInstance.getTrigger().hasNextFireTime(); logger.debug("Timer expiration date is {}", expirationTime); if (expirationTime != null) { timerService.createSingleActionTimer(expirationTime, config); logger.debug("Timer scheduled {} on {} scheduler service", timerJobInstance); localCache.putIfAbsent(((EjbGlobalJobHandle) timerJobInstance.getJobHandle()).getUuid(), timerJobInstance); } else { logger.info("Timer that was to be scheduled has already expired"); } }
@Override public void internalSchedule(TimerJobInstance timerJobInstance) { if (scheduler.isShutdown()) { return; } Date date = timerJobInstance.getTrigger().hasNextFireTime(); Callable<Void> item = (Callable<Void>) timerJobInstance; GlobalJDKJobHandle jobHandle = (GlobalJDKJobHandle) timerJobInstance.getJobHandle(); long then = date.getTime(); long now = System.currentTimeMillis(); ScheduledFuture<Void> future = null; if ( then >= now ) { future = scheduler.schedule( new RetriggerCallable(scheduler, item), then - now, TimeUnit.MILLISECONDS ); } else { future = scheduler.schedule( new RetriggerCallable(scheduler, item), 0, TimeUnit.MILLISECONDS ); } jobHandle.setFuture( future ); globalTimerService.getTimerJobFactoryManager().addTimerJobInstance( timerJobInstance ); }
@Override public JobHandle scheduleJob(Job job, JobContext ctx, Trigger trigger) { Date date = trigger.hasNextFireTime(); if ( date != null ) { String jobname = null;
if (ctx.getTrigger().hasNextFireTime() == null) { ctx.getTimer().setPeriod(0);
public void deserialize(MarshallerReaderContext inCtx, Timer timer) throws ClassNotFoundException { JBPMMessages.ProcessTimer ptimer = timer.getExtension(JBPMMessages.procTimer); TimerService ts = inCtx.wm.getTimerService(); long processInstanceId = ptimer.getTimer().getProcessInstanceId(); Trigger trigger = ProtobufInputMarshaller.readTrigger(inCtx, ptimer.getTrigger()); TimerInstance timerInstance = ProtobufProcessMarshaller.readTimer(inCtx, ptimer.getTimer()); TimerManager tm = ((InternalProcessRuntime) inCtx.wm.getProcessRuntime()).getTimerManager(); // check if the timer instance is not already registered to avoid duplicated timers if (!tm.getTimerMap().containsKey(timerInstance.getId())) { ProcessJobContext pctx = new ProcessJobContext(timerInstance, trigger, processInstanceId, inCtx.wm.getKnowledgeRuntime(), false); Date date = trigger.hasNextFireTime(); if (date != null) { long then = date.getTime(); long now = pctx.getKnowledgeRuntime().getSessionClock().getCurrentTime(); // overdue timer if (then < now) { trigger = new OverdueTrigger(trigger, pctx.getKnowledgeRuntime()); } } JobHandle jobHandle = ts.scheduleJob(processJob, pctx, trigger); timerInstance.setJobHandle(jobHandle); pctx.setJobHandle(jobHandle); tm.getTimerMap().put(timerInstance.getId(), timerInstance); } } }
if (ctx.getTrigger().hasNextFireTime() == null) { ctx.getTimer().setPeriod(0);