业务规则任务被用作同步执行一个或者多个规则。也可以调用Java代码或者提供一个外部工作的工作项去异步的执行,或者调用通过webservices实现的逻辑。

使用camunda的DMN引擎(Using Camunda DMN Engine):

可以集成Camunda的DMN引擎去执行DMN决策。必须将要计算的决策的key指定为camunda:decisionRef属性。另外,camunda:decisionRefBinding属性可以指定要执行的决策的版本。

camunda:decisionRefBinding属性的有效值为: 1.deployment:执行与流程版本一起部署的决策版本。 2.latest:执行最新的决策版本。 3.version:通过camunda:decisionRefVersion属性指明一个特定的版本。 4.versionTag:使用camunda:decisionRefVersionTag属性指明一个特定的版本tag去执行。

//version:
<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属性支持在任务执行时被执行的表达式(expression):

<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" />

映射器的详情参看用户指南:

resultVariable的名称(Name of the Result Variable):

变量的结果的名称不能是decisionResult,因为决策结果自身被保存在名叫decisionResult的变量里。否则在保存变量结果时会抛异常。

决策关联租户(DecisionRef Tenant Id):

当业务规则任务解析要执行的决策定义时,需要考虑多租户问题:

默认租户(Default Tenant Resolution):

默认情况下,调用流程定义的的租户被用来执行决策定义。也就是说,如果调用流程定义没有租户,业务规则执行决策时使用没有绑定租户的key(tenant id = null)。如果调用流程定义有租户,将会执行带有相同租户的决策定义。 ​ 请注意,默认行为不考虑调用流程实例的租户。

指定租户(Explicit Tenant Resolution):

在某些情况下,指定一个明确的租户,并且覆盖默认的行为是非常有用的。

<businessRuleTask id="businessRuleTask" 
        decisionRef="myDecision"
        camunda:decisionRefTenantId="TENANT_1">
</businessRuleTask>

如果在设计时不知道具体的租户编号,也可以用表达式:

<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
 camunda:decisionRefTenantId="${ myBean.calculateTenantId(variable) }">
</businessRuleTask>

表达式也允许调用流程实例的租户编号,而不是调用流程定义的(通过execution获取流程实例的变量):

<businessRuleTask id="businessRuleTask" decisionRef="myDecision"
 camunda:decisionRefTenantId="${ execution.tenantId }">
</businessRuleTask>

使用定制的规则引擎(Using a Custom Rule Engine):

你可以集成其他规则引擎,为此,你可以用服务任务(Service Task)相同的方式集成你的实现。

<businessRuleTask id="businessRuleTask"
  camunda:delegateExpression="${MyRuleServiceDelegate}" />

使用委托代码(Using Delegate Code):

或者,业务规则任务也可以通过Java Delegation实现,像服务(Service Task)任务一样。

作为一个外部任务实现(Implementing as an External Task):

此外,业务规则任务也可以通过外部任务(External Task)机制实现


世间山河广,祝你得偿所愿!