@Override public Void execute(CommandContext commandContext) { if (currentTaskEntity != null) { ExecutionEntity execution = commandContext .getExecutionEntityManager() .findExecutionById(currentTaskEntity.getExecutionId()); execution.setActivity(activity); execution.performOperation(AtomicOperation.TRANSITION_CREATE_SCOPE); if (variables != null) { if (currentTaskEntity.getExecutionId() != null) { currentTaskEntity.setExecutionVariables(variables); } else { currentTaskEntity.setVariables(variables); } } // 删除当前的任务,不能删除当前正在执行的任务,所以要先清除掉关联 Context.getCommandContext() .getTaskEntityManager() .deleteTask(currentTaskEntity, TaskEntity.DELETE_REASON_DELETED, false); } return null; }
public void handleEvent( EventSubscriptionEntity eventSubscription, Object payload, CommandContext commandContext) { String configuration = eventSubscription.getConfiguration(); if (configuration == null) { throw new ActivitiException( "Compensating execution not set for compensate event subscription with id " + eventSubscription.getId()); } ExecutionEntity compensatingExecution = commandContext.getExecutionEntityManager().findExecutionById(configuration); ActivityImpl compensationHandler = eventSubscription.getActivity(); if ((compensationHandler.getProperty(BpmnParse.PROPERTYNAME_IS_FOR_COMPENSATION) == null || !(Boolean) compensationHandler.getProperty(BpmnParse.PROPERTYNAME_IS_FOR_COMPENSATION)) && compensationHandler.isScope()) { // descend into scope: List<CompensateEventSubscriptionEntity> eventsForThisScope = compensatingExecution.getCompensateEventSubscriptions(); ScopeUtil.throwCompensationEvent(eventsForThisScope, compensatingExecution, false); } else { try { if (commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) { commandContext .getProcessEngineConfiguration() .getEventDispatcher() .dispatchEvent( ActivitiEventBuilder.createActivityEvent( ActivitiEventType.ACTIVITY_COMPENSATE, compensationHandler.getId(), compensatingExecution.getId(), compensatingExecution.getProcessInstanceId(), compensatingExecution.getProcessDefinitionId())); } compensatingExecution.setActivity(compensationHandler); // executing the atomic operation makes sure activity start events are fired compensatingExecution.performOperation(AtomicOperation.ACTIVITY_START); } catch (Exception e) { throw new ActivitiException( "Error while handling compensation event " + eventSubscription, e); } } }