private ExecutableRunner<RequestContext> getRunner() { return jobFactoryManager instanceof CommandServiceTimerJobFactoryManager ? ( (CommandServiceTimerJobFactoryManager) jobFactoryManager ).getRunner() : null; }
@Override public void setTimerJobFactoryManager(TimerJobFactoryManager timerJobFactoryManager) { if (jobFactoryManager instanceof CommandServiceTimerJobFactoryManager && timerJobFactoryManager instanceof CommandServiceTimerJobFactoryManager && getRunner() == null) { ( (CommandServiceTimerJobFactoryManager) jobFactoryManager ).setRunner( ( (CommandServiceTimerJobFactoryManager) timerJobFactoryManager ).getRunner() ); } }
@Override public Job getJob() { findDelegate(); return delegate.getJob(); }
protected void updateBasedOnTrigger(TimerInstance timerInstance) { Trigger trigger = ((DefaultJobHandle)timerInstance.getJobHandle()).getTimerJobInstance().getTrigger(); if (trigger instanceof IntervalTrigger && timerInstance.getPeriod() > 0) { IntervalTrigger intervalTrigger = (IntervalTrigger) trigger; if (timerInstance.getRepeatLimit() > 0) { timerInstance.setRepeatLimit(intervalTrigger.getRepeatLimit() - intervalTrigger.getRepeatCount() + 1); // +1 because repeatCount contains also one last scheduled, but cancelled trigger } long delay; if (intervalTrigger.getLastFireTime() != null) { // it is already fired calculate the new delay using the period instead of the delay delay = timerInstance.getPeriod() - (System.currentTimeMillis() - intervalTrigger.getLastFireTime().getTime()); } else { delay = timerInstance.getDelay() - (System.currentTimeMillis() - intervalTrigger.getCreatedTime().getTime()); } timerInstance.setDelay(delay); } }
public void addTimerJobInstance(TimerJobInstance instance) { JobContext ctx = instance.getJobContext(); if (ctx instanceof SelfRemovalJobContext) { ctx = ((SelfRemovalJobContext) ctx).getJobContext(); } Map<Long, TimerJobInstance> instances = null; if (ctx instanceof ProcessJobContext) { long sessionId = ((ProcessJobContext)ctx).getSessionId(); instances = timerInstances.get(sessionId); if (instances == null) { instances = new ConcurrentHashMap<Long, TimerJobInstance>(); timerInstances.put(sessionId, instances); } } else { instances = singleTimerInstances; } instances.put( instance.getJobHandle().getId(), instance ); }
@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 getJobHandle() { findDelegate(); return delegate.getJobHandle(); }
@Override public JobContext getJobContext() { findDelegate(); return delegate.getJobContext(); }
public void registerTimer(final TimerInstance timer, String processId, Map<String, Object> params) { try { kruntime.startOperation(); timer.setId(++timerId); timer.setProcessInstanceId(-1l); timer.setSessionId(((StatefulKnowledgeSession) kruntime).getIdentifier()); timer.setActivated(new Date()); Trigger trigger = null; if (timer.getCronExpression() != null) { Date startTime = new Date(timerService.getCurrentTime() + 1000); trigger = new CronTrigger(timerService.getCurrentTime(), startTime, null, -1, timer.getCronExpression(), null, null); // cron timers are by nature repeatable timer.setPeriod(1); } else { trigger = new IntervalTrigger(timerService.getCurrentTime(), null, null, timer.getRepeatLimit(), timer.getDelay(), timer.getPeriod(), null, null); } StartProcessJobContext ctx = new StartProcessJobContext(timer, trigger, processId, params, this.kruntime); JobHandle jobHandle = this.timerService.scheduleJob(startProcessJob, ctx, trigger); timer.setJobHandle(jobHandle); timers.put(timer.getId(), timer); } finally { kruntime.endOperation(); } }
protected void findDelegate() { if (delegate == null) { Collection<TimerJobInstance> timers = TimerServiceRegistry.getInstance().get(timerServiceId) .getTimerJobFactoryManager().getTimerJobInstances(); for (TimerJobInstance instance : timers) { if (((GlobalQuartzJobHandle)instance.getJobHandle()).getJobName().equals(jobname)) { delegate = instance; break; } } } }
@Override public Trigger getTrigger() { findDelegate(); return delegate.getTrigger(); }
public void clearTimerJobInstances(long id) { synchronized (timerJobsPerSession) { List<GlobalJobHandle> jobs = timerJobsPerSession.remove(id); logger.debug("Removed {} jobs for session {}", jobs, id); logger.debug("Size of timer jobs per session is {}", timerJobsPerSession.size()); if (jobs != null) { for (GlobalJobHandle handle : jobs) { jobFactoryManager.removeTimerJobInstance(handle.getTimerJobInstance()); } } } }
private void initTimer(InternalKnowledgeRuntime kruntime) { for (StartNode startNode : startNodes) { if (startNode != null && startNode.getTimer() != null) { TimerInstance timerInstance = null; if (startNode.getTimer().getDelay() != null && CronExpression.isValidExpression(startNode.getTimer().getDelay())) { timerInstance = new TimerInstance(); timerInstance.setCronExpression(startNode.getTimer().getDelay()); } else { timerInstance = createTimerInstance(startNode.getTimer(), kruntime); } timerManager.registerTimer(timerInstance, processId, null); } } }
public ProcessRuntimeImpl(InternalWorkingMemory workingMemory) { TimerService timerService = workingMemory.getTimerService(); if ( !(timerService.getTimerJobFactoryManager() instanceof CommandServiceTimerJobFactoryManager) ) { timerService.setTimerJobFactoryManager( new ThreadSafeTrackableTimeJobFactoryManager() ); } this.kruntime = (InternalKnowledgeRuntime) workingMemory.getKnowledgeRuntime(); initProcessInstanceManager(); initSignalManager(); timerManager = new TimerManager(kruntime, kruntime.getTimerService()); processEventSupport = new ProcessEventSupport(); if (isActive()) { initProcessEventListeners(); initStartTimers(); } initProcessActivationListener(); }
@Override public void afterCompletion(int status) { if ( status == TransactionManager.STATUS_COMMITTED && !timerJobInstance.getJobHandle().isCancel()) { this.schedulerService.internalSchedule(timerJobInstance); } }
public long getSessionId() { if (this.getTimerJobInstance() != null) { JobContext ctx = this.getTimerJobInstance().getJobContext(); if (ctx instanceof SelfRemovalJobContext) { ctx = ((SelfRemovalJobContext) ctx).getJobContext(); } if (ctx instanceof ProcessJobContext) { return ((ProcessJobContext)ctx).getSessionId(); } } return -1; }
public void registerTimer(final TimerInstance timer, ProcessInstance processInstance) { try { kruntime.startOperation(); timer.setId(++timerId); timer.setProcessInstanceId(processInstance.getId()); timer.setSessionId(((KieSession) kruntime).getIdentifier()); timer.setActivated(new Date()); Trigger trigger = null; if (timer.getCronExpression() != null) { Date startTime = new Date(timerService.getCurrentTime() + 1000); trigger = new CronTrigger(timerService.getCurrentTime(), startTime, null, -1, timer.getCronExpression(), null, null); // cron timers are by nature repeatable timer.setPeriod(1); } else { trigger = new IntervalTrigger(timerService.getCurrentTime(), null, null, timer.getRepeatLimit(), timer.getDelay(), timer.getPeriod(), null, null); } ProcessJobContext ctx = new ProcessJobContext(timer, trigger, processInstance.getId(), this.kruntime); JobHandle jobHandle = this.timerService.scheduleJob(processJob, ctx, trigger); timer.setJobHandle(jobHandle); timers.put(timer.getId(), timer); } finally { kruntime.endOperation(); } }
@Override public Void call() throws Exception { try { this.delegate.call(); return null; } catch (Exception e) { GlobalJDKJobHandle jobHandle = (GlobalJDKJobHandle) ((TimerJobInstance)this.delegate).getJobHandle(); if (retries < FAILED_JOB_RETRIES) { ScheduledFuture<Void> future = this.scheduler.schedule( this, FAILED_JOB_DELAY, TimeUnit.MILLISECONDS ); jobHandle.setFuture( future ); retries++; } else { logger.error("Timer execution failed {} times in a roll, unscheduling ({})", FAILED_JOB_RETRIES, jobHandle); } throw e; } }
public long getTimerId() { JobContext ctx = this.getTimerJobInstance().getJobContext(); if (ctx instanceof SelfRemovalJobContext) { ctx = ((SelfRemovalJobContext) ctx).getJobContext(); } return ((ProcessJobContext)ctx).getTimer().getId(); }
@Override public final void internalSchedule(final TimerJobInstance timerJobInstance) { if (hasEnvironmentEntry("IS_JTA_TRANSACTION", false)) { super.internalSchedule(timerJobInstance); return; } TransactionManager tm = getTransactionManager(timerJobInstance.getJobContext()); if (tm.getStatus() != TransactionManager.STATUS_NO_TRANSACTION && tm.getStatus() != TransactionManager.STATUS_ROLLEDBACK && tm.getStatus() != TransactionManager.STATUS_COMMITTED) { TransactionManagerHelper.registerTransactionSyncInContainer(tm, new ScheduleTimerTransactionSynchronization(timerJobInstance, delegate)); return; } super.internalSchedule(timerJobInstance); }