Java 数据驱动规则引擎-Drools

Java 数据驱动规则引擎-Drools,java,drools,rules,decision-tree,Java,Drools,Rules,Decision Tree,我一直在评估Drools作为用于我们的业务Web应用程序的规则引擎 我的用例是订单管理应用程序。 规则如下: -如果用户类型为“特殊”,则额外提供5%的折扣。 -如果用户已经购买了10多件商品,则额外提供3%的折扣。 -如果产品类别为“旧”,则向用户赠送价值5美元的礼品篮。 -如果产品类别为“新”,则向用户赠送价值1美元的礼品篮 -如果用户过去购买的物品超过1000美元,则免费送货 我看到的直接挑战是: -我无法向最终用户提供有意义的UI来修改规则 -从最终用户的角度来看,Guvnor UI或任

我一直在评估Drools作为用于我们的业务Web应用程序的规则引擎

我的用例是订单管理应用程序。
规则如下:
-如果用户类型为“特殊”,则额外提供5%的折扣。
-如果用户已经购买了10多件商品,则额外提供3%的折扣。
-如果产品类别为“旧”,则向用户赠送价值5美元的礼品篮。
-如果产品类别为“新”,则向用户赠送价值1美元的礼品篮
-如果用户过去购买的物品超过1000美元,则免费送货

我看到的直接挑战是:
-我无法向最终用户提供有意义的UI来修改规则
-从最终用户的角度来看,Guvnor UI或任何修改drl文件的编辑器都是不可接受的 -这些规则中的大多数将在数据库中的海量数据上运行

所以,
-我想让管理员用户在我的Web应用程序UI中指定这些规则。
-我是否可以将这些“规则”存储在数据库中,然后通过Drools对其进行操作——至少这允许我通过“自己的”UI“修改”这些规则。这有点像DB中的决策表。

-最好的办法是什么

一般来说,我发现在更抽象的级别(如域模型)上工作更容易,并且从该级别到Drools规则进行某种编程转换,而不是直接处理Drools规则。这样,您可以随意存储您的域模型,并且可以围绕它构建UI,等等,并且仍然可以根据需要生成Drools规则。然后,这方面的挑战是创建一个从模型到Drools规则的编程转换,但模板工具在这里会有所帮助。我已经为此使用了Groovy模板,而且效果很好。

您让我回答您的问题,让我回答您的问题。我对这个问题的回答是,SQL是执行存储在数据库中的业务规则的糟糕解决方案。问这个问题的人想从他们存储的业务规则生成SQL表达式,我警告不要这样做,因为这会导致安全性、可测试性、性能和维护方面的问题

我没有使用Drools,但我从文档中收集到它包括Guvnor,一个支持使用RDBMS作为用户定义规则的存储库的业务规则管理器

[Drools]Guvnor使用JCR标准存储规则等资产。默认实现是apachejackrabbit。这包括一个现成的存储引擎/数据库,您可以按原样使用,或者根据需要配置为使用现有的RDBMS。()

Apache Jackrabbit不是一个RDBMS,它是“内容存储库是一个分层的内容存储库,支持结构化和非结构化内容、全文搜索、版本控制、事务、观察等。”这似乎是一个更适合Drools的存储库

但Drools并没有说它试图使用SQL来执行这些业务规则。它有一个单独的组件,Drools Expert(规则引擎)来实现这一点

Drools Expert是一个声明式、基于规则的编码环境。这让你可以专注于“你想做什么”,而不是“如何做”。 ()

SQL也是一种声明式编程语言,但其设计目的是对表结构数据执行关系操作。实现规则引擎的语言有不同的目标,可能会做SQL做不到的事情(反之亦然)

因此,我建议,如果您使用Drools,可以在RDBMS编写文档时将其用作存储库(使用符合JCR的内容存储库实现,不要尝试设计自己的内容存储库)。然后使用Drools Expert作为专门为执行规则而设计的语言

  • 我无法向最终用户提供有意义的UI来修改规则
正如您所说,Guvnor提供了(和),这是开箱即用的。它提供了更复杂的规则,但您的规则看起来非常简单

  • 从最终用户的角度来看,Guvnor UI或任何修改drl文件的编辑器都是不可接受的
如前所述,Guvnor支持决策表。如果您不喜欢Guvnor web应用程序的布局,那么您可以直接进入自己的web应用程序

  • 这些规则中的大多数都会对数据库中的海量数据进行操作
数据库的大小与Guvnor的使用无关。Guvnor用于编辑规则,而不是运行时评估。Drools Expert是运行时规则引擎。很快。它可以处理大量数据和大量规则。您所需要做的就是编写数据库查询,以便在运行时将相关数据块放入规则引擎。无论您尝试实施什么解决方案,您都需要这样做


另一方面,如果您真正想要的是解释规则引擎何时是问题的好(或坏)解决方案,那么我建议您阅读Drools专家手册的一节。

kevinpeterson>感谢您的输入,但为什么还要麻烦将您的域规则转换为drl(Drools)?优势是,我们可以很容易地从web应用程序中解释域规则。然后本质上归结为——为什么流口水。我在这些领域没有经验,因此产生了这些问题。我同意用SQL实现业务逻辑是一个非常糟糕的想法,但将业务规则存储在数据库中,然后由“规则引擎”处理和执行并不是一个坏主意。事实上,我构建了一个基于物料清单的产品“配置器”,它将物料清单用作业务规则,影响哪些部分可以组合起来创建定制产品。规则由基于JavaScript的引擎进行评估,但保留在账单中。