1

在我的公司,我们计划在几个项目中使用 Drools 和 BRE。现在我们试图定义一些最佳实践。

我的问题是在规则条件/结果中应该做什么和不应该做什么。鉴于我们可以直接编写 Java 或调用方法(例如 From a Global object in the Working Memory)。

例子。给定一个评估通用对象(例如人)的规则,将属性设置为 true。现在,只能为进入数据库并获取该信息的对象定义该特定属性。所以我们有两种实现方式:

备选方案 A:

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

备选方案 B:

  • 插入具有连接到数据库的方法的全局对象并检查给定对象的属性。
  • 将对象插入到工作内存中进行评估
  • 在规则中,调用全局对象并执行对数据库的访问

其中哪个被认为更好?我真的很喜欢 A,但有时 B 更直接,但是如果引发数据库中的异常之类的会发生什么?

我已经在 Packt Publishing 的 Drools 5.0 书中看到了替代 B 的实现,但是他们只是在模拟,他们根本没有谈论访问数据库的实际含义。

谢谢,

4

2 回答 2

2

关于规则的一件事是它们可以被执行很多很多次。特别是如果您的规则条件出错。这显然会对性能产生影响。

我倾向于选择选项 A,在外面准备你的事实,并将它们插入工作记忆中进行评估。

当然,也可以选择将规则划分为数据加载规则,然后是业务规则评估(例如使用规则流)。

这将使您能够声明性地控制在代码之外填充数据。

于 2010-11-30T04:13:50.543 回答
1

我还需要从其他系统(数据库、服务调用等)获取外部数据,所以我已经处理了一点。就个人而言,我会根据您是否会预先知道您需要哪些事实来做出决定。如果是这样,那么无论如何,请随时使用 Java 进行调用。这将使您能够更好地处理错误。如果无法检索某些数据意味着无法运行规则引擎,那么您将避免创建会话、插入事实、设置全局变量等工作。如果您只是要停止(),那么启动它是没有意义的。

但当然也有一些无法检索数据不应该阻止您运行的情况。在其中一些情况下,备选方案 A 和 B 的效果同样好。但是假设需要某些数据取决于其他事情。例如,我在一个应用程序上工作,该应用程序评估本质上是大逻辑树,并使用来自服务调用的数据评估叶子。如果两片叶子被“与”在一起,那么它们的分支必须为真才能使它们的分支为真,一旦其中一个被评估为假,则该分支变为假,我不再需要评估另一片叶子。这意味着预先加载我评估它所需的数据是一种浪费。“按需”检索数据是 Jess 等规则引擎也支持反向链接的原因之一除了默认的前向链接。

在 Drools中完成反向链接之前,我看到的替代方法是使用“from”关键字。我有一些运气,但有两件事需要考虑:

  1. Drools 在规则引擎运行时重复查询“from”语句。我在我的服务层中使用缓存,因此这与 HashMap 查找一样有害,但如果您不缓存,您将冒着在不知不觉中进行数十、数百或数千次服务调用的风险。
  2. 如果您没有找到您期望的数据,那么就没有地方可以进行错误处理。这就是史蒂文希律所暗示的。规则引擎将继续运行,并将继续评估您给它的表达式。在我需要执行一些操作(例如调用 halt())的情况下,我在规则的结果中进行了服务调用。

我希望这有帮助。如果有什么我可以澄清或扩展的,请告诉我。

于 2010-12-18T19:00:54.073 回答