Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Spring Bean in Camunda condition

Tags:

spring

camunda

I have a Camunda process which looks like this:

enter image description here

I use an Exclusive Gateway to make a branch in my workflow: When an email is already confirmed I just go on, if not I want to confirm it.

To implement this, I added the following condition to my Sequence Flows:

<!-- GATEWAY -->
<bpmn2:exclusiveGateway id="ExclusiveGateway_1" default="GO_TO_CONFIRM_EMAIL">
    <bpmn2:incoming>SequenceFlow_4</bpmn2:incoming>
    <bpmn2:outgoing>GO_TO_CONFIRM_EMAIL</bpmn2:outgoing>
    <bpmn2:outgoing>GO_TO_IDENTIFY_ORDER</bpmn2:outgoing>
</bpmn2:exclusiveGateway>

<!-- DEFAULT FLOW -->
<bpmn2:sequenceFlow id="GO_TO_CONFIRM_EMAIL" name="!confirmed" sourceRef="ExclusiveGateway_1" targetRef="CONFIRM_EMAIL"/>

<!-- FLOW WITH CONDITION -->
<bpmn2:sequenceFlow id="GO_TO_IDENTIFY_ORDER" name="confirmed" sourceRef="ExclusiveGateway_1" targetRef="IDENTIFY_ORDER">
    <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${confirmEmailTaskAdapter.isConfirmed(CONFIRMED_ORDER_JSON)}</bpmn2:conditionExpression>
</bpmn2:sequenceFlow>

However, when I run this I get the following exception:

org.camunda.bpm.engine.ProcessEngineException: Cannot construct activity-execution mapping: there are more scope executions missing than explained by the flow scope hierarchy.
    at org.camunda.bpm.engine.impl.pvm.runtime.LegacyBehavior.createActivityExecutionMapping(LegacyBehavior.java:294)
    at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.createActivityExecutionMapping(PvmExecutionImpl.java:1211)
    at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.createActivityExecutionMapping(PvmExecutionImpl.java:1144)
    at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior$ErrorDeclarationFinder.collect(AbstractBpmnActivityBehavior.java:248)
    at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior$ErrorDeclarationFinder.collect(AbstractBpmnActivityBehavior.java:223)
    at org.camunda.bpm.engine.impl.tree.TreeWalker.walkUntil(TreeWalker.java:72)
    at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior.propagateError(AbstractBpmnActivityBehavior.java:124)
    at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior.propagateExceptionAsError(AbstractBpmnActivityBehavior.java:94)
    at org.camunda.bpm.engine.impl.bpmn.behavior.ServiceTaskExpressionActivityBehavior.execute(ServiceTaskExpressionActivityBehavior.java:64)
    at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:42)
    at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationActivityExecute.execute(PvmAtomicOperationActivityExecute.java:27)
    at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:134)
    at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:494)
    at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:484)
    at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:464)
    ... and some more ...

However, if I change the condition to something very simple, the process works:

<!-- THIS WORKS FINE -->
<bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${true}</bpmn2:conditionExpression>

My Spring Bean looks just normal:

@Component
public class ConfirmEmailTaskAdapter {
    public boolean isConfirmed(String json) {
        // bla bla bla
        return true;
    }
}

Why doesn't using my Spring Bean in the Camunda condition doesn't work?

like image 561
Thomas Uhrig Avatar asked Dec 13 '25 17:12

Thomas Uhrig


1 Answers

Since it helped Thomas, I will post my above comment as an answer, though it is not a technical solution for the issue.

Not a solution but a best-practice that might help as a workaround: we do not use dynamic service calls for gateway decisions, only pre-evaluated process variables. So in your case, why not have a Listener or even a serviceTask determine the confirmed value, write it to the process variables and than just use ${isConfirmed} on the sequence flow ...

like image 105
Jan Galinski Avatar answered Dec 16 '25 11:12

Jan Galinski



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!