public virtual void Completed(IExecutionEntity execution) { if (activityBehaviorInstance == null) { activityBehaviorInstance = ActivityBehaviorInstance; } if (activityBehaviorInstance is ISubProcessActivityBehavior) { ((ISubProcessActivityBehavior)activityBehaviorInstance).Completed(execution); } else { throw new ActivitiException("completed() can only be called on a " + activityBehaviorInstance.GetType().FullName + " instance"); } }
/// <summary> /// /// </summary> /// <param name="flowNode"></param> protected internal virtual void ExecuteSynchronous(FlowNode flowNode) { // Execution listener if (CollectionUtil.IsNotEmpty(flowNode.ExecutionListeners)) { ExecuteExecutionListeners(flowNode, BaseExecutionListenerFields.EVENTNAME_START); } commandContext.HistoryManager.RecordActivityStart(execution); // Execute actual behavior IActivityBehavior activityBehavior = (IActivityBehavior)flowNode.Behavior; if (activityBehavior != null) { logger.LogDebug($"Executing activityBehavior {activityBehavior.GetType()} on activity '{flowNode.Id}' with execution {execution.Id}"); ProcessEngineConfigurationImpl processEngineConfiguration = Context.ProcessEngineConfiguration; if (processEngineConfiguration != null && processEngineConfiguration.EventDispatcher.Enabled) { processEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateActivityEvent(ActivitiEventType.ACTIVITY_STARTED, flowNode.Id, flowNode.Name, execution.Id, execution.ProcessInstanceId, execution.ProcessDefinitionId, flowNode)); } try { activityBehavior.Execute(execution); } catch (BpmnError error) { // re-throw business fault so that it can be caught by an Error Intermediate Event or Error Event Sub-Process in the process ErrorPropagation.PropagateError(error, execution); } catch (Exception e) { if (LogMDC.MDCEnabled) { LogMDC.PutMDCExecution(execution); } throw e; } } else { logger.LogDebug($"No activityBehavior on activity '{flowNode.Id}' with execution {execution.Id}"); } }
/// <summary> /// /// </summary> /// <param name="activityBehavior"></param> /// <param name="flowNode"></param> protected internal virtual void ExecuteActivityBehavior(IActivityBehavior activityBehavior, FlowNode flowNode) { log.LogDebug($"Executing activityBehavior {activityBehavior.GetType()} on activity '{flowNode.Id}' with execution {execution.Id}"); ProcessEngineConfigurationImpl processEngineConfiguration = Context.ProcessEngineConfiguration; if (processEngineConfiguration != null && processEngineConfiguration.EventDispatcher.Enabled) { processEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateActivityEvent(ActivitiEventType.ACTIVITY_STARTED, flowNode.Id, flowNode.Name, execution.Id, execution.ProcessInstanceId, execution.ProcessDefinitionId, flowNode)); } try { activityBehavior.Execute(execution); } catch (Exception e) { throw new Exception($"{e.Message}", e); } }
/// <summary> /// /// </summary> /// <param name="boundaryEvents"></param> /// <param name="execution"></param> protected internal virtual void ExecuteBoundaryEvents(ICollection <BoundaryEvent> boundaryEvents, IExecutionEntity execution) { // The parent execution becomes a scope, and a child execution is created for each of the boundary events foreach (BoundaryEvent boundaryEvent in boundaryEvents) { if (CollectionUtil.IsEmpty(boundaryEvent.EventDefinitions) || (boundaryEvent.EventDefinitions[0] is CompensateEventDefinition)) { continue; } // A Child execution of the current execution is created to represent the boundary event being active IExecutionEntity childExecutionEntity = commandContext.ExecutionEntityManager.CreateChildExecution(execution); childExecutionEntity.ParentId = execution.Id; childExecutionEntity.CurrentFlowElement = boundaryEvent; childExecutionEntity.IsScope = false; IActivityBehavior boundaryEventBehavior = ((IActivityBehavior)boundaryEvent.Behavior); log.LogDebug($"Executing boundary event activityBehavior {boundaryEventBehavior.GetType()} with execution {childExecutionEntity.Id}"); boundaryEventBehavior.Execute(childExecutionEntity); } }