Hi ,
I am using a following BPMN.
Once the control reaches Task1_2 this calls an execution listener where it skips the Task_1_2. But there is a wierd behavior which is observed in the code … Task_1_3 is getting executed multiple times. It need to get executed only once. Any pointers on how to avoid it. Following is the ExecutionListener code.
package com.netcracker.camunda.utils;
import org.camunda.bpm.engine.AuthorizationException;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.impl.pvm.PvmActivity;
import org.camunda.bpm.engine.impl.pvm.PvmTransition;
import org.camunda.bpm.engine.impl.pvm.delegate.ActivityExecution;
import org.camunda.bpm.engine.impl.pvm.process.TransitionImpl;
import java.util.List;
import java.util.ListIterator;
public class SkipExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) throws Exception {
RuntimeService runtimeService = execution.getProcessEngineServices().getRuntimeService();
TaskService taskService = execution.getProcessEngineServices()
.getTaskService();
try{
String outTransitionId = null;
PvmActivity activity = ((ActivityExecution)execution).getActivity();
System.out.println(“activity name is–” +activity.getId());
List<PvmTransition> outgoingTransitions = (activity.getOutgoingTransitions());
System.out.println(“outgoingtransaitions size is—” +outgoingTransitions.size());
if(null!= outgoingTransitions && !outgoingTransitions.isEmpty()){
ListIterator itr = (ListIterator) outgoingTransitions.listIterator();
while(itr.hasNext()){
TransitionImpl outTransition = (TransitionImpl) itr.next();
//TODO check outTransition for default flow , then condition of forward execution
if(null != outTransition){
outTransitionId = outTransition.getId();
System.out.println(“transition id is–” +outTransitionId);
break;
}
}
}
try {
System.out.println(“activity instance id is—” +execution.getActivityInstanceId());
System.out.println(“activity id is ----” +((ActivityExecution) execution).getActivity().getId());
System.out.println(“Process Instance id is—” +execution.getProcessInstanceId());
runtimeService.createProcessInstanceModification(execution.getProcessInstanceId())
.startTransition(outTransitionId)
.cancelActivityInstance(execution.getActivityInstanceId())
.execute();
} catch (AuthorizationException e) {
throw e;
}
} catch (Exception e){
throw e;
}
}
}