Flowable源码注释(六十六)边界注册、取消、条件、变量事件活动行为类
作者:互联网
Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated
BoundaryEventRegistryEventActivityBehavior 边界事件注册事件活动行为类
/**
* 边界事件注册事件活动行为类
*
* @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();
}
}
CancelBoundaryEventActivityBehavior 取消边界事件活动行为类
/**
* 取消边界事件活动行为类
*
* @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();
}
}
}
BoundaryConditionalEventActivityBehavior 边界条件事件活动行为类
/**
* 边界条件事件活动行为类
*
* 条件边界事件(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);
}
}
}
}
BoundaryVariableListenerEventActivityBehavior 边界变量监听器事件活动行为类
/**
* 边界变量监听器事件活动行为类
*
* @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);
}
}
标签:processEngineConfiguration,Flowable,ExecutionEntity,源码,executionEntity,eventSubs 来源: https://blog.csdn.net/JinYJ2014/article/details/123586944