Use of Decision node

A decision node is used to guide the process running path. This means you can tell the workflow which way it should go. The decision criteria can be specified as follows:

  • Adding conditions to the transitions or BeanShell script which returns a boolean. The Nodes go across its transitions examining the conditions until found the first one that matches a criteria.
  • Creating a class which implements the DecisionHandler interface. The decision method returns the transition to follow.

Sample

Download the sample code Workflow_samples.zip.

Below there's a process with a decision node that implements the DecisionHandler interface to decide the next node in the workflow.

This process begins at the "start" node and goes across the transition named "initiate". This transition has an action called "createvalue" handler by the class "ValueAction", who set the variable "value" in the execution context.

public class ValueAction implements ActionHandler {
    private static final long serialVersionUID = 1L;
    public String value;
 
    @Override
    public void execute(ExecutionContext executionContext) throws Exception {
        executionContext.getContextInstance().setVariable("value", value);
    }
}

After that arrives to the "decision" node handled by the class "Decission2, who checks the existence of the "value" variable in the execution context. If exists this variable leave the node across the transition "trans1", otherwise go across "trans2".

public class MyDecision implements DecisionHandler {
    private static final long serialVersionUID = 1L;
 
    public MyDecision(String info) {
        super();
    }
 
    @Override
    public String decide(ExecutionContext executionContext) throws Exception {
        String value = (String)executionContext.getContextInstance().getVariable("value");
 
        if(value != null) {
            return "trans1";
        } else {
            return "trans2";
        }
    }
}

Finally when it arrives to any of the two "end" nodes, an action is executed which shows the node where the execution flow ends. This action is handled by the class "ShowMessageAction":  

public class ShowMessageAction implements ActionHandler {
    private static final long serialVersionUID = 1L;
 
    public ShowMessageAction(String info) {
        super();
    }
 
    @Override
    public void execute(ExecutionContext executionContext) throws Exception {
        System.out.println("Flow go to node: " + executionContext.getNode().getName());
    }
}

If in the configuration you have set the "value" variable in the console you will see a message saying that has finished in node "end_1". In the other side, will end in node "end_2".  

<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="decision node">
    <start-state name="start">
        <transition to="decision" name="initiate">
            <action name="createvalue" class="com.openkm.sample.ValueAction"></action>
        </transition>
    </start-state>
 
    <decision name="decision">
        <handler class="com.openkm.sample.MyDecision"></handler>
        <transition to="end_1" name="trans1"></transition>
        <transition to="end_2" name="trans2"></transition>
    </decision>
 
    <end-state name="end_1">
        <event type="node-enter">
            <action class="com.openkm.sample.ShowMessageAction"></action>
        </event>
    </end-state>
 
    <end-state name="end_2">
        <event type="node-enter">
            <action class="com.openkm.sample.ShowMessageAction"></action>
        </event>
    </end-state>
</process-definition>