@Override public void execute(ActivityExecution execution) throws Exception { // find cancel boundary event: ActivityImpl cancelBoundaryEvent = ScopeUtil.findInParentScopesByBehaviorType( (ActivityImpl) execution.getActivity(), CancelBoundaryEventActivityBehavior.class); if (cancelBoundaryEvent == null) { throw new ActivitiException( "Could not find cancel boundary event for cancel end event " + execution.getActivity()); } ActivityExecution scopeExecution = ScopeUtil.findScopeExecutionForScope( (ExecutionEntity) execution, cancelBoundaryEvent.getParentActivity()); // end all executions and process instances in the scope of the transaction scopeExecution.destroyScope("cancel end event fired"); // the scope execution executes the boundary event InterpretableExecution outgoingExecution = (InterpretableExecution) scopeExecution; outgoingExecution.setActivity(cancelBoundaryEvent); outgoingExecution.setActive(true); // execute the boundary cancelBoundaryEvent.getActivityBehavior().execute(outgoingExecution); }
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); } } }