protected void publishChanged(String previousState, String newState, boolean defer) { for (StateChangeMonitor monitor : context.getChangeMonitors()) { monitor.onChange(defer, previousState, newState, record, instanceContext.getState(), context); } }
protected void publish(boolean schedule, Event event, ProcessServiceContext context) { if (schedule) { DeferredUtils.deferPublish(context.getEventService(), event); } else { context.getEventService().publish(event); } }
@Override public ProcessManager getProcessManager() { return context.getProcessManager(); }
protected void acquireLockAndRun() { startLock(); try { context.getLockManager().lock(instanceContext.getProcessLock(), new LockCallbackNoReturn() { @Override public void doWithLockNoResult() { runWithProcessLock(); } }); } catch (FailedToAcquireLockException e) { throw new ProcessExecutionExitException(RESOURCE_BUSY, e); } }
protected void scheduleChain(final String chainProcess) { final ProcessState state = instanceContext.getState(); final LaunchConfiguration config = new LaunchConfiguration(chainProcess, record.getResourceType(), record.getResourceId(), record.getAccountId(), record.getPriority(), state.getData()); config.setParentProcessState(state); ExecutionExceptionHandler handler = this.context.getExceptionHandler(); Runnable run = new Runnable() { @Override public void run() { DefaultProcessInstanceImpl.this.context.getProcessManager().scheduleProcessInstance(config); log.debug("Chained [{}] to [{}]", record.getProcessName(), chainProcess); state.reload(); } }; if (handler == null) { run.run(); } else { handler.wrapChainSchedule(state, context, run); } }
protected ProcessInstance createProcessInstance(ProcessRecord record, boolean schedule, boolean replay) { if (record == null) return null; ProcessDefinition processDef = definitions.get(record.getProcessName()); if (processDef == null) throw new ProcessNotFoundException("Failed to find ProcessDefinition for [" + record.getProcessName() + "]"); ProcessState state = processDef.constructProcessState(record); if (state == null) throw new ProcessNotFoundException("Failed to construct ProcessState for [" + record.getProcessName() + "]"); if (record.getId() == null && (schedule || !EngineContext.hasParentProcess())) record = processRecordDao.insert(record); ProcessServiceContext context = new ProcessServiceContext(lockManager, eventService, this, exceptionHandler, changeMonitors); DefaultProcessInstanceImpl process = new DefaultProcessInstanceImpl(context, record, processDef, state, schedule, replay); if (record.getId() != null) queue(process); return process; }
try { log.debug("Attempting to run process [{}:{}] on resource [{}]", getName(), getId(), instanceContext.state.getResourceId()); return context.getLockManager().lock(lockDef, new LockCallback<ExitReason>() { @Override public ExitReason doWithLock() {
} catch (ExecutionException e) { Idempotent.tempDisable(); ExecutionExceptionHandler exceptionHandler = this.context.getExceptionHandler(); if (exceptionHandler != null) { exceptionHandler.handleException(e, state, this.context);
@Override public void run() { DefaultProcessInstanceImpl.this.context.getProcessManager().scheduleProcessInstance(config); log.debug("Chained [{}] to [{}]", record.getProcessName(), chainProcess); state.reload(); } };
@Override public void run() { Long id = record.getId(); if (id != null) { Event event = EventVO.newEvent(EngineEvents.PROCESS_EXECUTE).withResourceId(id.toString()); context.getEventService().publish(event); } } });
protected boolean shouldAbort(ProcessCancelException e) { ProcessDefinition def = context.getProcessManager().getProcessDelegate(instanceContext.getProcessDefinition()); if (def == null) { return true; } ProcessState state = def.constructProcessState(record); if (state.shouldCancel(record)) { return true; } ProcessInstanceContext newContext = new ProcessInstanceContext(); newContext.setProcessDefinition(def); newContext.setState(state); newContext.setPhase(ProcessPhase.STARTED); instanceContextHistory.push(instanceContext); instanceContext = newContext; return false; }
protected ExitReason executeWithProcessInstanceLock() { EngineContext engineContext = EngineContext.getEngineContext(); try { runDelegateLoop(engineContext); return exit(ExitReason.DONE); } catch (ProcessExecutionExitException e) { exit(e.getExitReason()); if (e.getExitReason() != null && e.getExitReason().getResult() == ProcessResult.SUCCESS) { return e.getExitReason(); } if (e.getExitReason().isRethrow()) { Throwable t = e.getCause(); ExceptionUtils.rethrowRuntime(t == null ? e : t); } throw new ProcessInstanceException(this, e); } finally { context.getProcessManager().persistState(this, schedule); } }