Hi,
Id like to add a case listener using groovy script to perform something like;
execution.close()
ie to close the case on completion. Hence is there something similar to ‘execution’ on a case complete event? The javadoc indicates there is a close method on CaseExecution class, however what is the best way to access the execution context in a case listener using script?
regards
Rob
Hi,
Looks like the answer is; caseExecution.
However if I call caseExecution.close() inside a completion event listener, I get an illegal state exception. I suspect this is caused by trying to change the state before it is flushed, but the stack trace is interesting…
org.camunda.bpm.engine.exception.cmmn.CaseIllegalStateTransitionException: ENGINE-05010 Could not perform transition 'complete on case execution with id 'c198c907-2999-11e7-8a99-28802304aa77'.Reason: The case execution is already in state 'completed'.
at org.camunda.bpm.engine.impl.cmmn.behavior.CmmnBehaviorLogger.isAlreadyInStateException(CmmnBehaviorLogger.java:165)
at org.camunda.bpm.engine.impl.cmmn.behavior.PlanItemDefinitionActivityBehavior.ensureTransitionAllowed(PlanItemDefinitionActivityBehavior.java:226)
at org.camunda.bpm.engine.impl.cmmn.behavior.StageActivityBehavior.onCompletion(StageActivityBehavior.java:98)
at org.camunda.bpm.engine.impl.cmmn.operation.AtomicOperationCaseExecutionComplete.triggerBehavior(AtomicOperationCaseExecutionComplete.java:29)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractAtomicOperationCaseExecutionComplete.eventNotificationsStarted(AbstractAtomicOperationCaseExecutionComplete.java:43)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractAtomicOperationCaseExecutionComplete.eventNotificationsStarted(AbstractAtomicOperationCaseExecutionComplete.java:33)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:41)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperationSync(CaseExecutionEntity.java:863)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:858)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.complete(CmmnExecution.java:982)
at org.camunda.bpm.engine.impl.cmmn.behavior.StageActivityBehavior.checkAndCompleteCaseExecution(StageActivityBehavior.java:466)
at org.camunda.bpm.engine.impl.cmmn.behavior.StageActivityBehavior.handleChildCompletion(StageActivityBehavior.java:408)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractAtomicOperationCaseExecutionComplete.postTransitionNotification(AbstractAtomicOperationCaseExecutionComplete.java:99)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.eventNotificationsCompleted(AbstractCmmnEventAtomicOperation.java:40)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.eventNotificationsCompleted(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:65)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperationSync(CaseExecutionEntity.java:863)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperationSync(CaseExecutionEntity.java:863)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:858)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.occur(CmmnExecution.java:990)
at org.camunda.bpm.engine.impl.cmmn.behavior.MilestoneActivityBehavior.fireEntryCriteria(MilestoneActivityBehavior.java:34)
at org.camunda.bpm.engine.impl.cmmn.operation.AtomicOperationCaseExecutionFireEntryCriteria.execute(AtomicOperationCaseExecutionFireEntryCriteria.java:32)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:858)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.fireEntryCriteria(CmmnExecution.java:640)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.checkAndFireEntryCriteria(CmmnExecution.java:624)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.fireSentries(CmmnExecution.java:576)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.handleChildTransition(CmmnExecution.java:329)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.performTransitionNotification(AbstractCmmnEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.eventNotificationsCompleted(AbstractCmmnEventAtomicOperation.java:39)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.eventNotificationsCompleted(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:65)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperationSync(CaseExecutionEntity.java:863)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.cmmn.operation.AbstractCmmnEventAtomicOperation.execute(AbstractCmmnEventAtomicOperation.java:26)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:145)
at org.camunda.bpm.engine.impl.interceptor.CommandContext$1.call(CommandContext.java:134)
at org.camunda.bpm.engine.impl.interceptor.CommandContext$1.call(CommandContext.java:132)
at org.camunda.bpm.engine.impl.context.ProcessApplicationClassloaderInterceptor.call(ProcessApplicationClassloaderInterceptor.java:44)
at org.camunda.bpm.application.AbstractProcessApplication.execute(AbstractProcessApplication.java:114)
at org.camunda.bpm.application.AbstractProcessApplication.execute(AbstractProcessApplication.java:125)
at org.camunda.bpm.engine.impl.context.Context.executeWithinProcessApplication(Context.java:192)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:132)
at org.camunda.bpm.engine.impl.cmmn.entity.runtime.CaseExecutionEntity.performOperation(CaseExecutionEntity.java:858)
at org.camunda.bpm.engine.impl.cmmn.execution.CmmnExecution.manualComplete(CmmnExecution.java:986)
at org.camunda.bpm.engine.impl.persistence.entity.TaskEntity.complete(TaskEntity.java:289)
at org.camunda.bpm.engine.impl.cmd.SubmitTaskFormCmd.execute(SubmitTaskFormCmd.java:74)
at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24)
at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:104)
at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:66)
at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30)
at org.camunda.bpm.engine.impl.FormServiceImpl.submitTaskForm(FormServiceImpl.java:86)
at org.camunda.bpm.engine.rest.sub.task.impl.TaskResourceImpl.submit(TaskResourceImpl.java:115)
... 52 more
Hi Rob,
CaseExecutionEntity#close
is not part of the interface DelegateCaseExecution
and therefore not intended to be called from a case execution listener. I think you should use CaseService
to make changes to the running case instance, but I don’t know if/how that works when called from a case execution listener.
Cheers,
Thorben
Hi Thorben,
Yes, I tried both caseExecution.close() and caseExecution.getProcessEngineServices.getCaseService().close(ID) etc. Within the case listener, the same exception is thrown. If I close the case outside of the listener, all works as expected…
regards
Rob
Hi Rob,
The way I understand the stacktrace, the case engine throws this exception after it has invoked the execution listeners. It then tries to complete the stage that was already completed/closed by your listener. Could you please share the CMMN model and listener implementation or even better a unit test provoking this exception?
Cheers,
Thorben