【问题标题】:how to fire selected rules in Drool如何在 Drool 中触发选定的规则
【发布时间】:2016-07-22 04:06:05
【问题描述】:

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

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

【问题讨论】:

    标签: drools rule-engine


    【解决方案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;
        //...
    }
    

    并编写一个议程过滤器

    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 );
    

    【讨论】:

    • 所以你是说为每个客户创建议程并根据议程触发规则......
    • 不,我不是这么说的。我是说您应该根据客户创建议程过滤器的实例。
    • 好的......我认为这对我有用,你能分享一些链接,我可以看到相同的完整实现并进一步理解它......
    • 大部分“完全实施”需要我没有的信息——这取决于客户和他们的规则。我添加了一些你应该可以自己编写的琐碎代码。
    • 我想获取需要为特定客户触发的规则列表以及触发这些规则的事实/事实列表,以便我只能从我的数据库中获取特定事实。在获取它们之后,触发特定于该客户的规则。
    【解决方案2】:
      static RuleFilter getFilterFor( String custname ){
             for( Customer cust: customers ){
                 if( cust.getName().equals( custname ) ){
                     return cust;
                 }
             } 
    

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

    【讨论】:

    • 这是一个很好的观点,但没有回答问题。应该是评论。最好在您可以发表评论之前对其他答案做出贡献。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多