【发布时间】:2016-07-22 04:06:05
【问题描述】:
1- 是否可以只为 Drool 中的特定客户触发选定的规则。假设我有 100 条规则,这些是来自不同客户的规则。因此,当特定客户打开应用程序时,我只想触发属于他的那些规则。一条规则可能属于多个客户。
2 - 我想获取需要为特定客户触发的规则列表以及触发这些规则的事实列表,以便我只能从我的数据库中获取特定事实。在获取它们之后,触发特定于该客户的规则
【问题讨论】:
标签: drools rule-engine
1- 是否可以只为 Drool 中的特定客户触发选定的规则。假设我有 100 条规则,这些是来自不同客户的规则。因此,当特定客户打开应用程序时,我只想触发属于他的那些规则。一条规则可能属于多个客户。
2 - 我想获取需要为特定客户触发的规则列表以及触发这些规则的事实列表,以便我只能从我的数据库中获取特定事实。在获取它们之后,触发特定于该客户的规则
【问题讨论】:
标签: drools rule-engine
您必须连同规则一起识别拥有客户,或维护将客户与规则相关联的数据。我认为后者是首选,但我将概述这两种解决方案。在任何情况下,客户都必须通过事实来识别。
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 );
【讨论】:
static RuleFilter getFilterFor( String custname ){
for( Customer cust: customers ){
if( cust.getName().equals( custname ) ){
return cust;
}
}
在方法签名中您返回 RuleFilter,但在 for 循环中您返回 cust,这将如何工作?
【讨论】: