How to Clear the Tasks which are stuck after process is terminated

Hi
My Question is regarding human tasks which get stuck in ACT_RU_TASK table when its associated process has been terminated.

  • Suppose I drive my case plan model from a cmmn file which triggers a certain bpmn process task say P1 (comprising of multiple human tasks).

  • If an another task in cmmn file sets the exit criterion of P1 it will terminate that process task and move ahead with the case flow, but associated human task of P1 which were started on instanciation of P1 still have entry in ACT_RU_TASK table.

Is there a mechanism by which those could be cleared on termination of associated process task.

Would really appreciate if someone can provide any pointer/help.

Hi,

Your observation is correct. If a process is started via a Process Task in CMMN, and if the Process Task is terminated via an exit criterion afterwards, then the started process remains active.

You could provide a case execution listener, which deletes the active process instance. It could look as follows:
<planItem definitionRef="ProcessTask_1" id="..."> <extensionElements> <camunda:caseExecutionListener event="exit" class="org.my.company.ExitListener" /> </extensionElements> </planItem>

And the listener could be implemented as follows:

public ExitListener implements CaseExecutionListener {

  public void notify(DelegateCaseExecution caseExecution) throws Exception {
    ProcessInstance instance = caseExecution.getProcessEngineServices()
      .getRuntimeService()
      .createProcessInstanceQuery()
      .superCaseInstanceId(caseExecution.getCaseInstanceId())
      .singleResult();    
    caseExecution.getProcessEngineServices()
      .getRuntimeService()
      .deleteProcessInstance(instance.getId(), null);
  }

}

Does it help you?

Cheers,
Roman

Sorry it didn’t work :worried:.

Process Engine is throwing null pointer exception while trying to delete the process instance id.

=============================
@Named
public class ProcessTerminationExecutionListener implements
CaseExecutionListener {

@Inject
Logger logger;
@Override
public void notify(DelegateCaseExecution paramDelegateCaseExecution)
		throws Exception {
	String caseInstanceId=paramDelegateCaseExecution.getCaseInstanceId();
	logger.info("Inside ProcessTerminationExecutionListener for caseInstanceId:"+caseInstanceId);
    ProcessInstance instance = paramDelegateCaseExecution.getProcessEngineServices()
      .getRuntimeService()
      .createProcessInstanceQuery()
      .superCaseInstanceId(caseInstanceId).processDefinitionKey(paramDelegateCaseExecution.getActivityId().split("PI_")[1])
      .singleResult();	 
    
    logger.info("ProcessInstance with Id:"+instance.getId()+" found for caseInstanceId:"+caseInstanceId);
    paramDelegateCaseExecution.getProcessEngineServices()
      .getRuntimeService()
      .deleteProcessInstance(instance.getId(), "Exit Event");
    logger.info("ProcessInstance with Id:"+instance.getId()+" deleted for caseInstanceId:"+caseInstanceId);
  }


}

============================================

18:15:59,672 ERROR [org.camunda.bpm.engine.context] (default task-8) ENGINE-16004 Exception while closing command context: null: java.lang.NullPointerException
at com.homeshop18.cms.business.cmmn.ProcessTerminationExecutionListener.notify(ProcessTerminationExecutionListener.java:36) [classes:]
at org.camunda.bpm.engine.impl.cmmn.delegate.CaseExecutionListenerInvocation.invoke(CaseExecutionListenerInvocation.java:36) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.delegate.DelegateInvocation.proceed(DelegateInvocation.java:54) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocationInContext(DefaultDelegateInterceptor.java:86) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:58) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.listener.DelegateExpressionCaseExecutionListener.notify(DelegateExpressionCaseExecutionListener.java:49) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.listener.DelegateExpressionCaseExecutionListener.notify(DelegateExpressionCaseExecutionListener.java:31) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.core.instance.CoreExecution.invokeListener(CoreExecution.java:93) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:51) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:208) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:758) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.performExit(CmmnExecution.java:861) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.behavior.PlanItemDefinitionActivityBehavior.performExit(PlanItemDefinitionActivityBehavior.java:149) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.behavior.StageOrTaskActivityBehavior.onExit(StageOrTaskActivityBehavior.java:133) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AtomicOperationCaseExecutionTerminatingOnExit.triggerBehavior(AtomicOperationCaseExecutionTerminatingOnExit.java:32) [camunda-engine-7.4.0.jar:7.4
.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractAtomicOperationCaseExecutionTerminating.execute(AbstractAtomicOperationCaseExecutionTerminating.java:31) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:208) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:758) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.exit(CmmnExecution.java:857) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.behavior.TaskActivityBehavior.fireExitCriteria(TaskActivityBehavior.java:37) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AtomicOperationCaseExecutionFireExitCriteria.execute(AtomicOperationCaseExecutionFireExitCriteria.java:32) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:208) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:758) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.fireExitCriteria(CmmnExecution.java:491) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.checkAndFireExitCriteria(CmmnExecution.java:456) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.fireSentries(CmmnExecution.java:430) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.handleChildTransition(CmmnExecution.java:333) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.performTransitionNotification(AbstractCmmnEventAtomicOperation.java:58) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.eventNotificationsCompleted(AbstractCmmnEventAtomicOperation.java:39) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.eventNotificationsCompleted(AbstractCmmnEventAtomicOperation.java:26) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:65) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:208) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperationSync(CaseExecutionEntity.java:763) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:208) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperationSync(CaseExecutionEntity.java:763) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:208) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:758) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.performExit(CmmnExecution.java:861) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.behavior.PlanItemDefinitionActivityBehavior.performExit(PlanItemDefinitionActivityBehavior.java:149) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.behavior.StageOrTaskActivityBehavior.onExit(StageOrTaskActivityBehavior.java:133) [camunda-engine-7.4.0.jar:7.4.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AtomicOperationCaseExecutionTerminatingOnExit.triggerBehavior(AtomicOperationCaseExecutionTerminatingOnExit.java:32) [camunda-engine-7.4.0.jar:7.4
.0]
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractAtomicOperationCaseExecutionTerminating.execute(AbstractAtomicOperationCaseExecutionTerminating.java:31) [camunda-engine-7.4.0.jar:7.4.0]

It is not the process engine throwing a NPE but your listener.

Check which statement is at line 36 (as indicated in your stack trace). Maybe your @Inject Logger is not working as expected?

Hi Roman,

Thanks for your help.
It worked in the end. I tried to debug the process engine code and could find out the reason of failure. It is an interesting scenario, so I thought I should share it.

Actually exit criteria was fulfilling the two exit sentries.

  1. First for the process instance which is currently active say P1 and second for the process instance which gets triggered upon completion of P1 say P2.
  2. Now P2 instance is currently not active that is why it threw null pointer exception on following

paramDelegateCaseExecution.getProcessEngineServices()
.getRuntimeService()
.deleteProcessInstance(instance.getId(), “Exit Event”);


There are two solutions
Either stop P2 instantiation by putting extra check on Entry sentry or by putting null check before deleting process Instance.

Thanks all for your response.