Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
/** * 边界事件注册事件活动行为类 * * @author Tijs Rademakers */ public class BoundaryEventRegistryEventActivityBehavior extends BoundaryEventActivityBehavior { private static final long serialVersionUID = 1L; protected String eventDefinitionKey; public BoundaryEventRegistryEventActivityBehavior(String eventDefinitionKey, boolean interrupting) { super(interrupting); this.eventDefinitionKey = eventDefinitionKey; } @Override public void execute(DelegateExecution execution) { CommandContext commandContext = Context.getCommandContext(); ExecutionEntity executionEntity = (ExecutionEntity) execution; ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); String eventDefinitionKey = getEventDefinitionKey(executionEntity, processEngineConfiguration); EventSubscriptionEntity eventSubscription = (EventSubscriptionEntity) processEngineConfiguration.getEventSubscriptionServiceConfiguration() .getEventSubscriptionService().createEventSubscriptionBuilder() .eventType(eventDefinitionKey) .executionId(executionEntity.getId()) .processInstanceId(executionEntity.getProcessInstanceId()) .activityId(executionEntity.getCurrentActivityId()) .processDefinitionId(executionEntity.getProcessDefinitionId()) .scopeType(ScopeTypes.BPMN) .tenantId(executionEntity.getTenantId()) .configuration(CorrelationUtil.getCorrelationKey(BpmnXMLConstants.ELEMENT_EVENT_CORRELATION_PARAMETER, commandContext, executionEntity)) .create(); CountingEntityUtil.handleInsertEventSubscriptionEntityCount(eventSubscription); executionEntity.getEventSubscriptions().add(eventSubscription); } @Override public void trigger(DelegateExecution execution, String triggerName, Object triggerData) { ExecutionEntity executionEntity = (ExecutionEntity) execution; BoundaryEvent boundaryEvent = (BoundaryEvent) execution.getCurrentFlowElement(); Object eventInstance = execution.getTransientVariables().get(EventConstants.EVENT_INSTANCE); if (eventInstance instanceof EventInstance) { EventInstanceBpmnUtil.handleEventInstanceOutParameters(execution, boundaryEvent, (EventInstance) eventInstance); } if (boundaryEvent.isCancelActivity()) { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); EventSubscriptionService eventSubscriptionService = processEngineConfiguration.getEventSubscriptionServiceConfiguration().getEventSubscriptionService(); List<EventSubscriptionEntity> eventSubscriptions = executionEntity.getEventSubscriptions(); String eventDefinitionKey = getEventDefinitionKey(executionEntity, processEngineConfiguration); for (EventSubscriptionEntity eventSubscription : eventSubscriptions) { if (Objects.equals(eventDefinitionKey, eventSubscription.getEventType())) { eventSubscriptionService.deleteEventSubscription(eventSubscription); CountingEntityUtil.handleDeleteEventSubscriptionEntityCount(eventSubscription); } } } super.trigger(executionEntity, triggerName, triggerData); } protected String getEventDefinitionKey(ExecutionEntity executionEntity, ProcessEngineConfigurationImpl processEngineConfiguration) { Object key = null; if (StringUtils.isNotEmpty(eventDefinitionKey)) { Expression expression = processEngineConfiguration.getExpressionManager() .createExpression(eventDefinitionKey); key = expression.getValue(executionEntity); } if (key == null) { throw new FlowableException("Could not resolve key for: " + eventDefinitionKey); } return key.toString(); } }
/** * 取消边界事件活动行为类 * * @author Daniel Meyer */ public class CancelBoundaryEventActivityBehavior extends FlowNodeActivityBehavior { @Override public void execute(DelegateExecution execution) { ActivityExecution activityExecution = (ActivityExecution) execution; List<CompensateEventSubscriptionEntity> eventSubscriptions = ((ExecutionEntity) execution).getCompensateEventSubscriptions(); if (eventSubscriptions.isEmpty()) { leave(activityExecution); } else { // 取消边界总是同步的 ScopeUtil.throwCompensationEvent(eventSubscriptions, activityExecution, false); } } @Override public void signal(ActivityExecution execution, String signalName, Object signalData) throws Exception { // 加入补偿执行 if (execution.getExecutions().isEmpty()) { leave(execution); } else { ((ExecutionEntity) execution).forceUpdate(); } } }
/** * 边界条件事件活动行为类 * * 条件边界事件(Conditional Boundary Event)类似如监听器,如果满足一个特定的条件,它就会被触发。 * * @author Tijs Rademakers */ public class BoundaryConditionalEventActivityBehavior extends BoundaryEventActivityBehavior { private static final long serialVersionUID = 1L; protected ConditionalEventDefinition conditionalEventDefinition; protected String conditionExpression; public BoundaryConditionalEventActivityBehavior(ConditionalEventDefinition conditionalEventDefinition, String conditionExpression, boolean interrupting) { super(interrupting); this.conditionalEventDefinition = conditionalEventDefinition; this.conditionExpression = conditionExpression; } @Override public void execute(DelegateExecution execution) { ExecutionEntity executionEntity = (ExecutionEntity) execution; ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher(); if (eventDispatcher != null && eventDispatcher.isEnabled()) { eventDispatcher.dispatchEvent(FlowableEventBuilder.createConditionalEvent(FlowableEngineEventType.ACTIVITY_CONDITIONAL_WAITING, executionEntity.getActivityId(), conditionExpression, executionEntity.getId(), executionEntity.getProcessInstanceId(), executionEntity.getProcessDefinitionId()), processEngineConfiguration.getEngineCfgKey()); } } @Override public void trigger(DelegateExecution execution, String triggerName, Object triggerData) { CommandContext commandContext = Context.getCommandContext(); ExecutionEntity executionEntity = (ExecutionEntity) execution; ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); Expression expression = processEngineConfiguration.getExpressionManager().createExpression(conditionExpression); Object result = expression.getValue(execution); if (result instanceof Boolean && (Boolean) result) { processEngineConfiguration.getActivityInstanceEntityManager().recordActivityStart(executionEntity); FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher(); if (eventDispatcher != null && eventDispatcher.isEnabled()) { eventDispatcher.dispatchEvent(FlowableEventBuilder.createConditionalEvent(FlowableEngineEventType.ACTIVITY_CONDITIONAL_RECEIVED, executionEntity.getActivityId(), conditionExpression, executionEntity.getId(), executionEntity.getProcessInstanceId(), executionEntity.getProcessDefinitionId()), processEngineConfiguration.getEngineCfgKey()); } if (interrupting) { executeInterruptingBehavior(executionEntity, commandContext); } else { executeNonInterruptingBehavior(executionEntity, commandContext); } } } }
/** * 边界变量监听器事件活动行为类 * * @author Joram Barrez * @author Tijs Rademakers */ public class BoundaryVariableListenerEventActivityBehavior extends BoundaryEventActivityBehavior { private static final long serialVersionUID = 1L; protected VariableListenerEventDefinition variableListenerEventDefinition; public BoundaryVariableListenerEventActivityBehavior(VariableListenerEventDefinition variableListenerEventDefinition, boolean interrupting) { super(interrupting); this.variableListenerEventDefinition = variableListenerEventDefinition; } @Override public void execute(DelegateExecution execution) { CommandContext commandContext = Context.getCommandContext(); ExecutionEntity executionEntity = (ExecutionEntity) execution; ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); String configuration = null; if (StringUtils.isNotEmpty(variableListenerEventDefinition.getVariableChangeType())) { ObjectNode configurationNode = processEngineConfiguration.getObjectMapper().createObjectNode(); configurationNode.put(VariableListenerEventDefinition.CHANGE_TYPE_PROPERTY, variableListenerEventDefinition.getVariableChangeType()); configuration = configurationNode.toString(); } EventSubscriptionEntity eventSubscription = (EventSubscriptionEntity) processEngineConfiguration.getEventSubscriptionServiceConfiguration() .getEventSubscriptionService().createEventSubscriptionBuilder() .eventType("variable") .eventName(variableListenerEventDefinition.getVariableName()) .configuration(configuration) .executionId(executionEntity.getId()) .processInstanceId(executionEntity.getProcessInstanceId()) .activityId(executionEntity.getCurrentActivityId()) .processDefinitionId(executionEntity.getProcessDefinitionId()) .tenantId(executionEntity.getTenantId()) .create(); CountingEntityUtil.handleInsertEventSubscriptionEntityCount(eventSubscription); executionEntity.getEventSubscriptions().add(eventSubscription); } @Override public void trigger(DelegateExecution execution, String triggerName, Object triggerData) { ExecutionEntity executionEntity = (ExecutionEntity) execution; BoundaryEvent boundaryEvent = (BoundaryEvent) execution.getCurrentFlowElement(); if (boundaryEvent.isCancelActivity()) { CommandContext commandContext = Context.getCommandContext(); ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); EventSubscriptionService eventSubscriptionService = processEngineConfiguration.getEventSubscriptionServiceConfiguration().getEventSubscriptionService(); List<EventSubscriptionEntity> eventSubscriptions = executionEntity.getEventSubscriptions(); for (EventSubscriptionEntity eventSubscription : eventSubscriptions) { if ("variable".equals(eventSubscription.getEventType()) && variableListenerEventDefinition.getVariableName().equals(eventSubscription.getEventName())) { eventSubscriptionService.deleteEventSubscription(eventSubscription); CountingEntityUtil.handleDeleteEventSubscriptionEntityCount(eventSubscription); } } } super.trigger(executionEntity, triggerName, triggerData); } }