如何在Drool中触发选定的规则

时间:2016-07-22 04:06:06

标签: drools rule-engine

1-是否可以在Drool中仅为特定客户触发选定的规则。假设我有100条规则,这些规则来自不同的客户。因此,当特定客户打开应用程序时,我只想触发那些属于他的规则。规则可能属于多个客户。

2 - 我想得到一个需要为特定客户解雇的规则列表以及触发这些规则的事实列表,以便我只能从我的数据库中获取特定的事实。在获取它们之后,触发那些特定于该客户的规则

2 个答案:

答案 0 :(得分:2)

您必须识别拥有的客户以及规则,或维护将客户与规则相关联的数据。我认为后者是首选,但我将概述两种解决方案。无论如何,必须通过事实来识别客户。

rule "some rule"
when
    Customer( id in ("Smith&Co", "Brown&Sons", "Jones Inc." ) )
    ...
then ... end

将客户与您需要的规则相关联:

class Customer {
    private String name;
    private List<String> rules;
    //...
}

并写一个AgendaFilter

class RuleFilter implements AgendaFilter {
    static List<Customer> customers = new ArrayList<>();
    static {
        customers.add(...);
        ...
    }
    static RuleFilter getFilterFor( String custname ){
         for( Customer cust: customers ){
             if( cust.getName().equals( custname ) ){
                 return cust;
             }
         }
         throw IllegalArgumentException( "no customer: " + custname );
    }
    Customer current;
    RuleFilter( Customer current ){
        this.current = current;
    }
    // ... getters & setters
    boolean accept( Match match ){
        return current.getRules().contains( match.getRule().getName() );
    }
}

通过提供过滤器实例为客户运行会话:

 AgendaFilter currFilter = RuleFilter( getFilterFor( customername ) ); 
 fireAllRules( currFilter );

答案 1 :(得分:-1)

  static RuleFilter getFilterFor( String custname ){
         for( Customer cust: customers ){
             if( cust.getName().equals( custname ) ){
                 return cust;
             }
         } 

在方法签名中你返回RuleFilter,但是在for循环中你返回cust,这是怎么回事?