Decision Service in the Process Engine
The decision service is a part of the process engine’s Services API. It allows to evaluate a deployed decision definition independently from BPMN and CMMN.
Evaluating a Decision
To evaluate a deployed decision, reference it by id or a combination of key and version. If a key is used but no version is specified then the latest version of decision definition with the given key is evaluated.
DecisionService decisionService = processEngine.getDecisionService(); VariableMap variables = Variables.createVariables() .putValue("status", "bronze") .putValue("sum", 1000); DmnDecisionResult decisionResult = decisionService .evaluateDecisionByKey("decision-key") .variables(variables) .evaluate(); // alternatively for decision tables only DmnDecisionTableResult decisionResult = decisionService .evaluateDecisionTableByKey("decision-key") .variables(variables) .evaluate();
The Decision Key
The key of a decision definition is specified by the
id attribute of the
decision element in the DMN XML. The different naming is related to the
Versioning of Decisions. Since a key can reference multiple versions of a
decision definition, the id specifies exactly one version.
A decision may reference one or more variables. For example, a variable can be referenced in an input expression or an input entry of a decision table. The variables are passed to the decision service as key-value pairs. Each pair specifies the name and the value of a variable.
For more information on the different expressions see the DMN 1.3 reference.
Authorizations for Evaluating Decisions
The user needs the permission
CREATE_INSTANCE on the resource
DECISION_DEFINITION to evaluate decisions. The resource id of the
authorization is the decision definition key.
For more information about authorizations please refer to the Authorization Service section.
Working with the Decision Result
The result of an evaluation is called decision result. The decision result is a complex object
DmnDecisionResult. Think of it as a list of key-value pairs.
If the decision is implemented as decision table then each entry in the list represents one matched rule. The output entries of this rule are represented by the key-value pairs. The key of a pair is specified by the name of the output.
Instead, if the decision is implemented as decision literal expression then the list contains only one entry. This entry represents the expression value and is mapped by the variable name.
The decision result provides methods from interface
Object>> and some convenience methods.
DmnDecisionResult decisionResult = ...; // get the value of the single entry of the only matched rule String singleEntry = decisionResult.getSingleResult().getSingleEntry(); // get the value of the result entry with name 'result' of the only matched rule String result = decisionResult.getSingleResult().getEntry("result"); // get the value of the first entry of the second matched rule String firstValue = decisionResult.get(1).getFirstEntry(); // get a list of all entries with the output name 'result' of all matched rules List<String> results = decisionResult.collectEntries("result"); // shortcut to get the single output entry of the single rule result // - combine getSingleResult() and getSingleEntry() String result = decisionResult.getSingleEntry();
Note that the decision result also provides methods to get typed output entries. A complete list of all methods can be found in the Java Docs .
If the decision is implemented as decision table then it can also be evaluated using one of the
methods. In this case, the evaluation returns a DmnDecisionTableResult
which is semantically equal and provide the same methods as a
History of Evaluated Decisions
When a decision is evaluated, a new history entry of type
HistoricDecisionInstance is created which contains the inputs and outputs of
the decision. The history can be queried by the history service.
List<HistoricDecisionInstance> historicDecisions = processEngine .getHistoryService() .createHistoricDecisionInstanceQuery() .decisionDefinitionKey("decision-key") .includeInputs() .includeOutputs() .list();
For more information about this, please refer to the History for DMN Decisions.