Problem with skipping task

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;
}

}
}

status_monitor_LONG.bpmn (13.2 KB)