package com.mossle.bpm.cmd; import java.lang.reflect.Method; import org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior; import org.activiti.engine.impl.cmd.NeedsActiveExecutionCmd; import org.activiti.engine.impl.interceptor.CommandContext; import org.activiti.engine.impl.persistence.entity.ExecutionEntity; import org.activiti.engine.impl.pvm.delegate.ActivityExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SignalStartEventCmd extends NeedsActiveExecutionCmd<Object> { private static Logger logger = LoggerFactory .getLogger(SignalStartEventCmd.class); public SignalStartEventCmd(String executionId) { super(executionId); } protected Object execute(CommandContext commandContext, ExecutionEntity execution) { try { FlowNodeActivityBehavior activityBehavior = (FlowNodeActivityBehavior) execution .getActivity().getActivityBehavior(); Method method = FlowNodeActivityBehavior.class.getDeclaredMethod( "leave", ActivityExecution.class); method.setAccessible(true); method.invoke(activityBehavior, execution); method.setAccessible(false); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } return null; } @Override protected String getSuspendedExceptionMessage() { return "Cannot signal an execution that is suspended"; } }