Business Rule Task 业务规则任务
一个业务规则任务可以同步执行一个或多个规则,可以调用Java代码或外部工作者(external worker)来实现,或者以异步方式调用以Web服务形式实现的逻辑。
使用 Camunda DMN 引擎
你可以使用Camunda DMN引擎集成来进行一个DMN决策。你必须使用camunda:decisionRef
属性
指定要评估的决策键。此外。
camunda:decisionRefBinding
指定哪一个版本的决策应该被评估。
camunda:decisionRefBinding
的有效值是:
deployment
, 这会评估deployment部署的决策版本,latest
这将始终评估最新的决策版本,version
这允许你通过使用camunda:decisionRefVersion
属性指定执行的特定版本,versionTag
这允许你用camunda:decisionRefVersionTag
属性指定一个特定的版本标签来执行。
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="myDecision"
camunda:decisionRefBinding="version"
camunda:decisionRefVersion="12" />
camunda:decisionRefBinding
属性默认为latest
。
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="myDecision" />
属性camunda:decisionRef
、camunda:decisionRefVersion
和camunda:decisionRefVersionTag
可以被指定为
一个表达式,它将在任务的执行中被计算。
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="${decisionKey}"
camunda:decisionRefBinding="version"
camunda:decisionRefVersion="${decisionVersion}" />
决策的输出,也称为决策结果,不会自动保存为流程变量。它必须通过使用预定义或者定制的方式传递到一个流程变量中。
如果是预定义的映射,camunda:mapDecisionResult
属性会引用要使用的映射器。映射的结果被保存在由camunda:resultVariable
属性指定的变量中。如果没有设置预定义的映射器,那么默认使用 resultList
映射器。
<businessRuleTask id="businessRuleTask"
camunda:decisionRef="myDecision"
camunda:mapDecisionResult="singleEntry"
camunda:resultVariable="result" />
参见 用户指南 有关映射的详细信息。
结果变量的名称
结果变量不应该使用 decisionResult
这个名字,因为决策结果本身是保存在一个这个变量中。否则,在保存结果变量时就会出现异常。
决策参考中的租户Id (Tenant Id)
当业务规则任务(Business Rule Task)解析要进行评估的决策定义时,必须考虑多租户的情况。
默认租户(Tenant)决定
默认情况下,调用流程定义的租户id 被用来评估决策定义。 也就是说,如果调用的流程定义没有租户 ID,那么业务规则任务将使用所提供的key和没有 租户ID 的决策定义绑定进行评估(租户 ID = null)。 如果调用的流程定义有租户ID,那么将评估具有所提供的key和相同租户ID 的决策定义。
注意,调用流程实例的租户ID在默认情况下是不被考虑的。
额外的租户(Tenant)决定
在某些情况下,覆盖默认行为并明确指定租户ID是有用的。
camunda:decisionRefTenantId
属性允许明确指定租户ID。
<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
camunda:decisionRefTenantId="TENANT_1">
</businessRuleTask>
如果在设计流程时不知道租户ID,也可以使用一个表达式:
<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
camunda:decisionRefTenantId="${ myBean.calculateTenantId(variable) }">
</businessRuleTask>
表达式也允许使用调用流程实例的租户ID,而不是调用流程定义的:
<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
camunda:decisionRefTenantId="${ execution.tenantId }">
</businessRuleTask>
使用自定义规则引擎
你可以与其他规则引擎整合。要做到这一点,你必须实现你的规则任务(rule task),规则任务与服务任务(Service Task)实现的方式是相同的。
<businessRuleTask id="businessRuleTask"
camunda:delegateExpression="${MyRuleServiceDelegate}" />
使用委托代码
另外,业务规则任务也可以像服务任务一样使用Java委托来实现。要了解更多相关信息, 请参见 服务任务 章节.
实现为外部任务
除上述内容外,还可以通过外部任务机制实现业务规则任务, 外部系统会轮询流程引擎的工作。参见服务任务一节, 了解更多关于如何配置外部任务的信息。
Chamunda 扩展
属性 | camunda:asyncBefore, camunda:asyncAfter, camunda:class, camunda:decisionRef, camunda:decisionRefBinding, camunda:decisionRefTenantId, camunda:decisionRefVersion, camunda:decisionRefVersionTag, camunda:delegateExpression, camunda:exclusive, camunda:expression, camunda:jobPriority, camunda:mapDecisionResult, camunda:resultVariable, camunda:topic, camunda:type, camunda:taskPriority |
---|---|
扩展元素 | camunda:failedJobRetryTimeCycle, camunda:field, camunda:connector, camunda:inputOutput |
约束 |
One of the attributes camunda:class , camunda:delegateExpression , camunda:decisionRef ,
camunda:type or camunda:expression is mandatory
|
The attribute camunda:resultVariable can only be used in combination with the
camunda:decisionRef or camunda:expression attribute
|
|
The camunda:exclusive attribute is only evaluated if the attribute
camunda:asyncBefore or camunda:asyncAfter is set to true
|
|
The attribute camunda:topic can only be used when the camunda:type attribute is set to external .
|
|
The attribute camunda:taskPriority can only be used when the camunda:type attribute is set to external .
|