1

我有一种情况,对于每种产品,我都有不同的规则。

因此,每个产品我将有 1 个 drl。

因此,据我了解,我有一个选择:

  1. 将所有这些知识包添加到一个知识库中。

然后让 Drools 使用产品的 id 匹配正确的规则。

when 

avs : AvailabilityStatus( available == true, quantity <= 50, productId = 7899 ) 

then    

avs.setDiscountRate("0.65");

end 
  1. 为每个产品创建一个新的知识库,即 50 个产品,50 个知识库,每个知识库只加载一个 drl。

在我的网络应用程序中,每个请求都需要对产品规则进行新的评估。

我不知道哪种方法更有效。

4

3 回答 3

2

KnowledgeBase 是一个非常非常昂贵的实例化对象,所以我不会在每次需要评估规则时都创建一个。

我认为您提到的第一种方法更好(将所有规则都放在一个 drl 中)。这也为跨产品制定规则留出了余地(想象一下,如果您想添加价格规则,并且您想模拟购买 2,获得第 3 次免费)。

还有第三种方法,您仍然可以为每个产品拥有一个 drl,但您将所有这些都加载到同一个知识库中。这类似于单一责任原则,但适用于规则。

于 2012-10-15T08:03:28.900 回答
2

如果您需要为每个产品编写规则,则可能有多个规则具有相同类型的 LHS,仅更改参数,例如

when 
  avs : AvailabilityStatus( available == true, quantity <= 50, productId = 7899 ) 
then
  //update

那么你可以考虑使用决策表。Drools 可以自己生成规则。如用户指南中所述

于 2012-10-17T14:12:34.810 回答
0

我建议您只创建一个知识库并将二进制包存储在文件系统中。当您想要添加新规则时,您需要重新生成二进制包。不要为每个规则创建一个 drl,这没有任何意义。干杯

于 2012-10-16T00:22:08.640 回答