2010-11-29 60 views
1

在我的公司,我们计划在几个项目中使用Drools a BRE。现在我们试图定义一些最佳做法。Drools - 在规则条件或后果内做复杂的东西

我的问题是应该是什么,应该不是一个规则条件/结果内进行。 鉴于我们可以直接编写Java或调用方法(例如,从工作内存中的全局对象)。

例子。给定一个评估通用对象(例如Person)属性设置为true的规则。现在,该特定属性只能定义为该对象进入数据库并获取该信息。因此,我们必须执行该两种方式:

备选方案A:

  • 转到数据库并获取对象属性(真/假代码)
  • 插入对象在工作存储器
  • 评估规则

替代B:

  • 插入具有连接到数据库的方法全局对象和检查的财产给定对象。
  • 插入对象在工作记忆
  • 在规则EVAL,调用全局对象并执行访问数据库

其中那些被认为是更好?我非常喜欢A,但是有时B更直接,但是如果像数据库中的Exception那样引发了什么,会发生什么?

我已经看到了由Packt出版Drools的5.0书实施的替代B,但是他们正在做的嘲弄,他们不谈论要去的数据库中所有的实际意义。

谢谢

回答

1

我也有一个需要抓住从其他系统(数据库,服务电话等),外部数据,所以我已经处理了这一点。就我个人而言,我会根据您是否知道您事先需要哪些事实来做出决定。如果是这样,那么通过一切手段,随意使用Java进行调用。这将允许你做更好的错误处理。如果无法检索某些数据,意味着运行规则引擎是不行的,您将避免创建会话,插入事实,设置全局变量等工作。如果你只是暂停(),没有意义。

但是,当然也有不能检索数据不应阻止你运行的情况。在其中一些情况下,备选方案A和B将同样奏效。但是,假设需要某些数据取决于其他事情。例如,我在一个应用程序上工作,该应用程序评估实质上是大逻辑树,并使用来自服务调用的数据评估叶子。如果两片叶子被安放在一起,所以两者必须是真的,因为它们的分支是真的,只要其中一个被评估为假,那个分支就变成假,我不再需要评估另一片叶子。这意味着预先加载我需要的数据来评估它是件浪费。 “随需应变”检索数据是像Jess这样的规则引擎除了缺省前向链之外还支持backward chaining的原因之一。

直到反向链接is complete在Drools中,我见过的另一种选择是使用"from" keyword。我有一些运气,但有两件事需要考虑:

  1. Drools在规则引擎运行时反复查询“from”语句。我在服务层使用缓存,所以这与HashMap查找一样有害,但是如果你不缓存,你可能会冒不知不觉造成数十,数百或数千服务调用的风险。
  2. 如果您没有找到您期望的数据,则无法进行错误处理。这就是史蒂文希律所提到的。规则引擎将继续执行,并将继续评估您给出的表达式。在需要采取一些措施(例如调用halt())的情况下,我会根据规则的结果进行服务调用。

我希望这会有所帮助。让我知道,如果有任何我可以澄清或扩大。

+1

我们也在考虑使用Drools Flow/Salience组合来定义我们是否需要“加载”数据(基于定义的标准)。此外,“from”关键字可用于管理复杂层次结构,而无需在工作内存中插入所有对象。 – mfcabrera 2011-02-04 14:41:01

2

的事情之一,有关规则是,他们可以执行很多次。特别是如果您在规则条件下犯错。这显然会对性能产生影响。

我倾向于再喜欢选项A,外面准备你的事实,并将其插入到用于评估工作记忆。

当然,也有分区的规则为数据加载规则,那么业务规则评估(例如使用规则流)的选项。

这会给你声明控制填充代码之外的数据。

+0

提及“多次,多次”+1。我即将发表类似的评论。 – 2010-12-29 05:53:49