如何覆盖 Drools 6 中的规则和决策表?
How to Override rules and decision tables in Drools 6?
有一种情况我们有一套主规则。其中一条规则类似于以下规则:
rule "Check Eligibility"
when
$response(type=="rest",age== 25)
then
$response.setSendLetter("Y");
$response.setUpdateStatus("eligible");
end
客户可以使用这些规则。我们希望我们的客户能够自定义规则。如果决定不定制,则规则应适用于它们。自定义可以在 "when" 中添加附加条件,也可以覆盖现有条件并添加或修改 "when" 部分。他们还可以添加到规则的 "then" 部分。
类似于:
rule "Check Eligibility"
when
$response(type=="rest",age== 27, state="IL")
then
$response.setSendLetter("N");
$response.setUpdateStatus("eligible");
$response.setSendEmail("Y");
end
我们还有一些需要类似定制的决策表。
根据规则,最初建议使用 "extends",但据我所知,"extends" 的工作方式与 "AND" 相同,它会检查父项和子项的条件,如果两者都为真它会做 "then" 部分。
我能想到的可能解决方案是为每个客户克隆主存储库,然后每当主存储库规则发生变化时,我们都会拉取客户存储库。可能的问题可能是偶尔需要手动解决的合并冲突。
克隆解决方案尚未在团队中被接受,所以想知道实现规则和决策表的 "override" 的可能解决方案是什么?
存在技术问题和管理问题。
如果您的管理层决定让客户乱搞规则,他们必须意识到后果。显然,不应让客户独自遵守他们的规则,但您的组织继续对整个应用程序的无瑕疵功能负责。 你不可能免费做到这一点,客户有更多的回旋余地,它就会变得越贵。
对此没有合适的技术解决方案。扩展不适合您描述的那种修改:必须替换规则。
- 您可以(如您所写)复制 DRL 文件(在您的 CM 系统中创建一个分支)并让客户编辑。这是一种干净的方法;您可以使用其他测试(要分支的另一个 CM 项目)来测试客户的基线,并使用众所周知的 CM 技术进行部署。
- 另一种方法是让客户编写另一个 DRL 文件,其中包含需要更改的规则。但是您不能将此 DRL 文件与原始文件一起编译;不允许重复规则。有变通办法,例如,通过替换已编译的 KiePackages 中的规则,或禁用 KieBase 中的覆盖规则,但它们具有要求使用不稳定内部 API.
的令人讨厌的暗示
- 您可以尝试定义允许客户使用的 DRL 语言子集,并使用基于该子集的某些 DSL 编写和覆盖规则,可能在 XML 或类似的语言中。然后,生成器可以检查数据并创建 DRL 文本。使用这种方法,覆盖是一个简单的功能,由生成器处理。但是需要大量的开发工作。
就 Excel 文件中作为电子表格编写的决策表而言,您无论如何都需要克隆。我想不出任何其他修改此类规则集的解决方案。
有一种情况我们有一套主规则。其中一条规则类似于以下规则:
rule "Check Eligibility"
when
$response(type=="rest",age== 25)
then
$response.setSendLetter("Y");
$response.setUpdateStatus("eligible");
end
客户可以使用这些规则。我们希望我们的客户能够自定义规则。如果决定不定制,则规则应适用于它们。自定义可以在 "when" 中添加附加条件,也可以覆盖现有条件并添加或修改 "when" 部分。他们还可以添加到规则的 "then" 部分。
类似于:
rule "Check Eligibility"
when
$response(type=="rest",age== 27, state="IL")
then
$response.setSendLetter("N");
$response.setUpdateStatus("eligible");
$response.setSendEmail("Y");
end
我们还有一些需要类似定制的决策表。
根据规则,最初建议使用 "extends",但据我所知,"extends" 的工作方式与 "AND" 相同,它会检查父项和子项的条件,如果两者都为真它会做 "then" 部分。
我能想到的可能解决方案是为每个客户克隆主存储库,然后每当主存储库规则发生变化时,我们都会拉取客户存储库。可能的问题可能是偶尔需要手动解决的合并冲突。
克隆解决方案尚未在团队中被接受,所以想知道实现规则和决策表的 "override" 的可能解决方案是什么?
存在技术问题和管理问题。
如果您的管理层决定让客户乱搞规则,他们必须意识到后果。显然,不应让客户独自遵守他们的规则,但您的组织继续对整个应用程序的无瑕疵功能负责。 你不可能免费做到这一点,客户有更多的回旋余地,它就会变得越贵。
对此没有合适的技术解决方案。扩展不适合您描述的那种修改:必须替换规则。
- 您可以(如您所写)复制 DRL 文件(在您的 CM 系统中创建一个分支)并让客户编辑。这是一种干净的方法;您可以使用其他测试(要分支的另一个 CM 项目)来测试客户的基线,并使用众所周知的 CM 技术进行部署。
- 另一种方法是让客户编写另一个 DRL 文件,其中包含需要更改的规则。但是您不能将此 DRL 文件与原始文件一起编译;不允许重复规则。有变通办法,例如,通过替换已编译的 KiePackages 中的规则,或禁用 KieBase 中的覆盖规则,但它们具有要求使用不稳定内部 API. 的令人讨厌的暗示
- 您可以尝试定义允许客户使用的 DRL 语言子集,并使用基于该子集的某些 DSL 编写和覆盖规则,可能在 XML 或类似的语言中。然后,生成器可以检查数据并创建 DRL 文本。使用这种方法,覆盖是一个简单的功能,由生成器处理。但是需要大量的开发工作。
就 Excel 文件中作为电子表格编写的决策表而言,您无论如何都需要克隆。我想不出任何其他修改此类规则集的解决方案。