首页 文章

如何在Drool中激活选定的规则

提问于
浏览
0

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

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

2 回答

  • -1

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

    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
    static RuleFilter getFilterFor( String custname ){
             for( Customer cust: customers ){
                 if( cust.getName().equals( custname ) ){
                     return cust;
                 }
             }
    

    在方法签名中,您将返回RuleFilter,但在for循环中,您将返回cust,这是如何工作的?

相关问题