业务规则任务被用作同步执行一个或者多个规则。也可以调用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)机制实现