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