每次需要评估规则时创建新的Drools KnowledgeBase是否昂贵?

时间:2012-10-15 07:52:21

标签: drools

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

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

因此,据我所知,我有一个选择:

  1. 将所有这些知识包添加到单个KnowledgeBase中。
  2. 然后让Drools使用产品的ID匹配正确的规则。

    when 
    
    avs : AvailabilityStatus( available == true, quantity <= 50, productId = 7899 ) 
    
    then    
    
    avs.setDiscountRate("0.65");
    
    end 
    
    1. 为每个产品创建一个新的知识库,即50个产品,50个知识库,每个只加载一个drl。
    2. 在我的网络应用中,每个请求都需要对产品规则进行新的评估。

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

3 个答案:

答案 0 :(得分:2)

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

我认为你提到的第一种方法更好(将所有规则都纳入一个drl)。这也使得选项可以在各个产品之间执行规则(想象一下,如果您想要添加价格规则,并且想要建立买2,获得第3个免费)。

还有第三种方法,您可以在每个产品中使用一个drl,但是您可以在同一知识库中加载所有产品。这类似于sigle responsibility principle,但适用于规则。

答案 1 :(得分:2)

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

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

然后您可以考虑使用决策表。 Drools可以自己生成规则。 As stated in users guide

答案 2 :(得分:0)

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