流程引擎中的决策服务类

决策服务是流程引擎的 Services API 的一部分。 它允许独立于 BPMN 和 CMMN 评估已部署的决策定义。

评估决策

要评估已部署的决策,请通过 id 或Key和版本的组合来引用它。 如果使用Key但未指定版本,则评估具有给定Key的决策定义的最新版本。

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(); 

决策定义Key

决策定义Key由 DMN XML 中“decision”元素的“id”属性指定。不同的命名与决策的版本化有关。由于Key可以引用决策定义的多个版本,因此 id 仅指定一个版本。

传递数据

决策可能会引用一个或多个变量。 例如,可以在输入表达式或决策表的输入条目中引用变量。 变量作为键值对传递给决策服务。 每对指定变量的名称和值。

有关不同表达式的更多信息,请参阅[DMN 1.3 参考][DMN 1.3 参考]。

评估决策的授权

用户需要对资源DECISION_DEFINITION 的权限CREATE_INSTANCE 来评估决策。 授权的资源 id 是决策定义键。

有关授权的更多信息,请参阅 授权服务 部分。

使用决策结果

评估的结果称为决策结果。 决策结果是一个类型为“DmnDecisionResult”的复杂对象。 将其视为键值对列表。

如果决策被实现为决策表,那么列表中的每个条目代表一个匹配的规则。 此规则的输出条目由键值对表示。 一对密钥由输出名称指定。

相反,如果决策被实现为 决策文字表达式,那么该列表仅包含一个条目。 此条目表示表达式值并由变量名称映射。

决策结果提供了接口List<Map<String, Object>>的方法和一些方便的方法。

DmnDecisionResult decisionResult = ...;

// 获取唯一匹配规则的单个条目的值
String singleEntry = decisionResult.getSingleResult().getSingleEntry();

// 获取唯一匹配规则名称为“result”的结果条目的值
String result = decisionResult.getSingleResult().getEntry("result");

// 获取第二个匹配规则的第一个条目的值
String firstValue = decisionResult.get(1).getFirstEntry();

// 获取所有匹配规则的输出名称为“result”的所有条目的列表
List<String> results = decisionResult.collectEntries("result");

// 获取单个规则结果的单个输出条目的快捷方式
// - 结合 getSingleResult() 和 getSingleEntry()
String result = decisionResult.getSingleEntry();

请注意,决策结果还提供了获取类型化输出条目的方法。 在 Java Docs 中可以找到所有方法的完整列表。

如果决策被实施为决策表,那么它也可以使用evaluateDecisionTable 中的方法。 在这种情况下,结果返回一个 DmnDecisionTableResult ,它与DmnDecisionResult 在语义和方法上是相等的。

评估决策的历史

评估决策时,会创建一个新的历史记录条目,类型为“HistoricDecisionInstance”,其中包含决策的输入和输出。 历史可以通过历史服务进行查询。

List<HistoricDecisionInstance> historicDecisions = processEngine
  .getHistoryService()
  .createHistoricDecisionInstanceQuery()
  .decisionDefinitionKey("decision-key")
  .includeInputs()
  .includeOutputs()
  .list();

有关这方面的更多信息,请参阅DMN 决策的历史

目录: