如何在Drools 6中覆盖规则和决策表?

时间:2015-10-17 05:43:25

标签: drools

我们有一套主规则。其中一条规则类似于以下规则:

rule "Check Eligibility"
when 
    $response(type=="rest",age== 25)
then 
   $response.setSendLetter("Y");
   $response.setUpdateStatus("eligible");
end

这些规则将提供给客户。我们希望客户能够自定义规则。如果决定不自定义,那么规则应该适用于它们。定制可能会在"中添加额外的条件。或者可以覆盖现有条件,也可以添加或修改"当"部分。他们还可以添加"然后"规则的一部分。

类似的东西:

rule "Check Eligibility"
when 
   $response(type=="rest",age== 27, state="IL")
then 
   $response.setSendLetter("N");
   $response.setUpdateStatus("eligible");
   $response.setSendEmail("Y");
end

我们还有一些需要类似定制的决策表。

根据规则,最初建议使用"延伸"但是从我所知道的"延伸"作为" AND"它将检查父母和孩子的条件,如果两者都是真的,它将做"然后"部分。

我可以想到的可能解决方案是为每个客户克隆主存储库,然后每当主存储库规则发生变化时,我们就会对客户存储库进行操作。可能的问题可能是偶尔的合并冲突,可能必须手动解决。

克隆解决方案尚未被团队接受,因此想知道实现什么是可能的解决方案"覆盖"对于规则和决策表?

1 个答案:

答案 0 :(得分:0)

存在技术问题和管理问题。

如果管理层决定让客户搞乱规则,他们必须意识到后果。显然,客户不应该单独遵守他们的规则,但是您的组织仍然要对整个应用程序的无瑕疵功能负责。 你无法免费做到这一点,而且客户拥有的余地越多,它就会越贵。

对此没有舒适的技术解决方案。扩展不适合您所描述的那种修改:必须替换规则。

  1. 您可以(如您所述)复制DRL文件(在CM系统中创建分支)并让客户进行编辑。这是一个干净的方法;您可以使用其他测试(另一个要分支的CM项目)测试客户的基线,并使用众所周知的CM技术进行部署。
  2. 另一种方法是让客户编写另一个包含需要更改的规则的DRL文件。但是你不能将这个DRL文件与原始DRL文件一起编译;不允许复制规则。有一些解决方法,例如,通过替换已编译的KiePackages中的规则,或禁用KieBase中的重写规则,但它们具有要求使用非稳定内部API的令人讨厌的含义。
  3. 您可以尝试定义允许客户使用的DRL语言的子集,并使用基于子集的某些DSL编写和覆盖规则,可能是XML或类似的。然后,生成器可以检查数据并创建DRL文本。通过这种方法,覆盖是一个简单的特征,由发生器处理。但是需要进行大量的开发工作。
  4. 就Excel文件上的电子表格编写的决策表而言,您无论如何都需要克隆。我无法想到在这些规则集中修改的任何其他解决方案。