针对Java开发规则引擎的一种优化
最近,有一种想法是在公司内部的项目中使用规则引擎,drools是一个不错的框架,内置的rete引擎,使得规则处理能够高效的进行。在业务系统如何使 用Rule Engine,这个是一个很有挑战性的考量,我会在后续的blog中进一步的思考这个问题。本文则主要思考如何对Java开发规则,提出一些想法。
drools一般的,使用某种规则语言来进行规则的开发工作,在drools2.1中,就有好多种选择:
- Domain Specific Languages
- Java Semantic Module
- Java Annotation Semantic Module
- Groovy Semantic Module
- Python Semantic Module
- CSharp Semantic Module
这里是从 http://drools.codehaus.org/Java+Annotation+Semantic+Module 摘取的一个例子:
import org.drools.semantics.annotation.*;
@DroolsRule
public class Hello {
@DroolsCondition
public boolean isTrader(@DroolsParameter("user") User user) {
@DroolsCondition
public boolean isMarketOpen(@DroolsParameter("order") Order order,
public boolean isTrader(@DroolsParameter("user") User user) {
return user.getType () == UserType.TRADER;
}@DroolsCondition
public boolean isMarketOpen(@DroolsParameter("order") Order order,
@DroolsApplicationData("calendar") MarketCalendar calendar{
return calendar.isExchangeOpen(order.getExchange(), order.getTradeTime());
} @DroolsConsequence
public void consequence(...) {
...
}
}这种开发方式最大的一个好处,就是说这些规则的编写可以利用Java的IDE来进行正确性保证,本文提到的优化则是考虑利用字节码分析的手段,对Condition的方法进行智能化的分析,从而自动的分解成为多个&&(and)模式的Condition。
例如:
public boolean checkCondtion(Order order){
return (order.status == 1) && (order.user != null);
}可以分解成为
public boolean checkCondition1(Order order){
return order.status == 1;
}public boolean checkCondition2(Order order){
return order.user != null;
}除了进行这样的分解之外,优化的引擎还可以利用字节码技术来检查两个条件是否是等效的,从而实现Chain的功能,目前的Drools中暂时还不支持这一技术,因此,实际上会大大的限制使用 Java POJO来开发规则。
此外,还有更多的优化是可以进行的,而且,应该可以较大幅度的提高规则引擎的效率,就是对Condition彼此之间进行推理,比如说,会存在这样的集中关系:
- C1 ==> C2 当C1满足时,C2肯定满足,此时,不再需要重复的执行对C2的求值
- C1 ==> !C2,当C1满足时,C2肯定不满足,此时,不需要再次对C2求值
- !C1 ==> C2,当C1不满足时,C2满足
- !C1 ==> !C2, 当C1不满足时,C2不满足
- 更为常见的情况,C1,C2,...Cn满足Hash命中,即计算一个表达式Expr,当其值为V1,V2,...Vn时,C1,C2,...Cn满足,在这种情况下,不需要多次的评估Expr,而只需评估一次即可。
为此:需要的扩展是:
1、编写字节码分析工具,将Java字节码转换为等效的ExprCondition,这个可以开源的jode基础之上进行。
2、扩展drools,在rete引擎的基础上,支持对ExprCondition的优化。
我个人觉得,如果这个任务能够完成,Drools将可以更为简单、更为高效的在业务软件中进行应用,我会在后续的时间内对这一问题进一步的研究。
0 Comments:
张贴评论
<< Home