ipointer

给我最爱的宝宝
随笔 - 47, 文章 - 0, 评论 - 230, 引用 - 1
数据加载中……

.net开源项目nxbre中flow engine的研究报告

 

上周刚刚看完了nxbre,写了一个ppt给项目组评审,用来拟定我们GSP中的规则引擎的实现需求。
    不知为什么我上传不了文件,只好把ppt的内容贴出来给大家共享。大家如果这个开源项目感兴趣,可以留言索取。ppt中不可能把细节讲的很清楚,而且由于时间关系,只写了其中的flow engine,请见谅。

Nxbre
的简介
 

Nxbre包括interface engineflow engine

两种引擎的区别

the Flow Engine, which uses XML as a way to control process flow for an application in an external entity. It is basically a wrapper on C#, as it offers all its flow control commands (if/then/else, while, foreach), plus a context of business objects and results.

 

the Inference Engine, which is a forward-chaining (data driven) deduction engine and that supports concepts like Facts, Queries and Implications (as defined in RuleML 0.86 Datalog) and like Rule Priority, Mutual Exclusion and Precondition(as found in many commercial engines). It is designed in a way that encourages the separation of roles between the expert who designs the business rules and the programmer who binds them to the business objects.

 

两种引擎使用的场景

1.      the Inference Engine supports priority, mutual exclusions and pre-conditions,

2.      the Inference Engine uses a "standard" rule format (RuleML),

3.      the Inference Engine has an elaborated memory model with support for isolated deduction space.

4.      Interface Engine 更适合于知识库或专家系统,因为在这样的系统中,facts必须被保持

5.      Flow Engine 只是对一段逻辑进行了解析,并根据结果去做action

6.      The Flow Engine is really an instantaneous traversal of logical branches using transient data for evaluations of boolean expressions.

 

选择的理由

1.      在我们的GSP系统中,没有对fact保持的需求,没有通过规则优先级、互斥和前置条件的判断来选择规则

2.      Flow Engine 相对简单,易于维护

所以,应该Flow Engine是一个合适的选择


Flow Engine
的介绍

加载和卸载规则集的API (BREImpl)

Init

Reset

数据操作的APIIBRERuleContext

SetObject

GetObject

引擎执行的API (BREImpl)

Process

Stop


规则引擎基本遵循以下5个典型的步骤 

1.      创建规则引擎对象

2.      向引擎中加载规则集或更换规则集

3.      向引擎提交需要被规则集处理的数据对象集合

4.      命令引擎执行

5.      导出引擎执行结果,从引擎中撤出处理过的数据


Flow Engine
中的规则文件

规则语言一般分为两类:

面向程序技术的规则语言,使用者是技术人员。在Flow Engine中是.bre文件(结构是businessRule.xsd规定的) ,引擎真正解析的也是这个文件。

面向业务的规则语言,使用者是业务人员。规则定制器应该生成这份文档。在Flow Engine中是.xbre文件(结构是businessRule.xsd规定的) 。

两种Schema的转换是由transformXRules.xsl文件规定的。

Flow Engine为加载规则文件提供了以下的类:IRulesDriver,AbstractRuelsDriver,BusinessRulesFileDriver,XSLTRulesFileDriver,XBusinessRulesFileDriver, XBusinessRulesStreamDriver, XBusinessRulesStringDriver


Flow Engine
中的规则上下文

规则上下文中包含如下四块:

1.      RuleFactory(hashtable),包含rule的解决方法,可以是默认的,也可以是自定义的

2.      Operator(hashtable),包含可用的比较操作符,如:==,<,>

3.      Result(hashtable),包含result和用户初始的数据,lookupobject就是在result集中查找数据对象。每条<rule>都会产生一条result,每条result又会包含metadata和结果数据。metadata中包含产生这条resultrulefactoryparam

4.      CallStack(stack),目前没发现有什么用,只是在往Result集中添加result的同时也往此中添加

支持上下文的主要类型:IBRERuleContext,AbstractBRERuleContext,BRERuleContextImpl

 

 

Flow Engine创建规则引擎对象 

构建BREFactoryConsole对象,他负责构建BREImpl对象,并向外发布引擎中出现的logexception

构建BREImp对象之前,必须首先构建BREFactory,他负责将logexception的代理挂到BREImp对象中的相应event上去

IRuleDriver初始化BREImp对象

相关的类型: BREFactoryConsoleBREFactoryBREImp

 

Flow Engine加载规则集

Flow Enginerule(在.bre文件中用<rule>标签标识的部分)是一些用id唯一标识的对象。加载这些rule的方式有两种:

1.      在引擎初始的时候,先从规则文件中查找<factory>标签,找到需要加载的RuleFactory。通过反射的方式,创建该类型的实例(引擎默认的rule

2.      在引擎的运行时,外部需要对规则文件中定义的rule有特殊的处理,必须在外部环境中构造BRERuleFactory对象,并以一个代理作为它的参数,在代理的方法中实现对rule的处理

讨论:是否还需要第三种方式,因为使用第二种方式扩展系统时,外部环境开发者不得不很了解目前使用的规则文件中到底使用了哪些扩展的rule,并为这些rule些处理方法。当我们修改了规则文件,并添加了一些扩展rule时,外部环境的开发者不得不修改他们的程序,以适应新的规则文件。

我们现在想要的是像使用默认的rule一样方式来使用扩展rule,这就需要我们用一种注册的方式,在引擎加载rule之前,将扩展的rule注册进系统。

 

所有的rule都必须通过引擎上下文(IBRERuleContext)的SetFactory方法注册进引擎上下文中

IBRERuleFactory中有ExecuteRule方法,这就是处理默认rule的方法

支持规则集的相关类型:IBRERuleFactory,BRERuleFactory(主要是为自定义的rule设计的,他的ExecuteRule中只是调用了代理)

在写代理方法的时候注意,引擎调用代理的时候,可以提供上下文和相关的参数,这是我们极其需要的

 

Flow Engine加载操作符
 

很简单,在BREImplinit()方法中,用反射的方式从当前Assembly中查找所有实现IBREOperator接口的类型,创建实例,加入上下文中。

这里的操作符只是if语句中判断大小用的,而+-*/,或其他数学函数,我认为可以作为默认的rule来对待

支持的相关类型:IBRERuleOperator,实现他的类其实就是实现一个comparestrategy

讨论:这一块是不是能满足需求

 

Flow Engine中提交数据对象
 

如前所述,数据对象在系统中是被当成result来处理的,封装他的BRERuleObject类继承于AbstractBRERuleResult,会被插入上下文的result集中。数据对象被封装到BRERuleObjectResult属性中。

具体的,在外部环境中,通过上下文的SetObject(id,object),就可以将数据对象添加到上下文中了。

同样,获取数据对象的时候用上下文的GetObject(id)

 

Flow Engine中命令引擎执行
 

在启动引擎之前,要注意必须执行BREImplReset()方法,清空留在上下文中的上一次的Result集和CallStack清空,否则,可能会干扰本次的执行。这有一次表明了Flow Engine是一个对逻辑分支的瞬时遍历,他不能保存结果,也不能用于以往知识对执行实例有影响的系统中。

要执行引擎,只需调用BREImplprocess()方法,引擎就会根据规则文件中指定的逻辑来执行了。

更具体的,processxml()方法判断XPathNavigator当前节点的类型,跳转到特定的处理程序中。

如果当前节点有子节点,那么调用DoRecursion()来进行迭代。

执行的方式是先深的遍历。

 

Flow Engine中导出结果
 

很简单,通过上下文的GetResult(id),就能导出运行的结果。Id与该条ruleid相同。

真正结果封装在AbstractBRERuleResultresult属性中

 

Flow Engine中的logException处理
 

提供了丰富的向外部暴露内部运行情况的接口

还指定了logexception的级别,用于向不同的终端暴露信息

内部使用DispatchLog(message,level),DispatchException(message,level)

 

posted on 2005-11-16 13:35 栖息的熊 阅读(2331) 评论(29)  编辑 收藏 所属分类: .net学习

评论

#1楼    回复  引用  查看    

只能上传zip与rar文件。
2005-11-16 15:18 | dudu      

#2楼    回复  引用  查看    

你好,能否共享下:) 谢谢!
2005-11-16 18:03 | floerggyy      

#3楼    回复  引用  查看    

忘留mail了,不好意思
mailover@gmail.com
2005-11-16 18:03 | floerggyy      

#4楼    回复  引用  查看    

我以前有关注过一段时间的规则引擎.这是我的个人网站上收录的相关规则引擎的文章.http://www.keyusoft.cn/contentlist.aspx?bigcatid=2&smallcatid=14
zhangshanyou@gmail.com

#5楼    回复  引用  查看    

非常感兴趣。
希望楼主能进一步和大家分享Nxbre的应用场景、设计思想等。
2005-11-17 09:14 | 风满袖      

#6楼    回复  引用    

oliocn@hotmail.com
2005-11-28 09:29 | 文山 [未注册用户]

#7楼    回复  引用    

没有例子吗?
2005-12-15 16:56 | iamsunrise [未注册用户]

#8楼 [楼主]   回复  引用  查看    

我写了例子,如果我兴趣的话,我可以贴一下,过一段时间吧,最近很忙,老被PM狠批,不干正事。哈哈。
2005-12-15 17:12 | 栖息的熊      

#9楼    回复  引用    

何时可以发来看看.

sunriseyuen@hotmail.com
2005-12-16 19:38 | iamsunrise [未注册用户]

#10楼    回复  引用    

。谢谢了,比较感兴趣。。可不可以发了一分给我呢?
workhyj@163.com
2005-12-30 10:56 | workhyj [未注册用户]

#11楼    回复  引用    

你好,这段时间对规则引擎非常有兴趣,发现java社区开源的引擎产品有几个,但是基于.net的开源产品,没有找到,能把你的一些心得发给我了解了解吗?
zxarcg@gmail.com,多谢了!
2006-01-02 02:53 | zxar [未注册用户]

#12楼    回复  引用    

非常关注。
谢谢,能否也发一份给我?hongershen@hotmail.com
2006-03-11 21:07 | honger [未注册用户]

#13楼    回复  引用    

呵呵,.net很少见到,非常关注!
能发一份吗?
谢谢!joy_ahai@yahoo.com.cn
2006-03-22 20:59 | ahai [未注册用户]

#14楼    回复  引用    

xxysky@gmail.com
2006-04-07 20:49 | 132 [未注册用户]

#15楼    回复  引用  查看    

有没有应用场景,请给我发个示例,谢谢!!


wujm77@gmail.com,
2006-04-20 17:19 | 吴建明      

#16楼    回复  引用  查看    

有没有应用场景,请给我发个示例,谢谢!!


wujm77@gmail.com,
2006-04-20 17:19 | 吴建明      

#17楼    回复  引用    

我目前正在学习用.NET设计工作流引擎,看了很多资料都是理论上的东西,不是楼主能否发一份给我学习一下?谢谢!
tanouq@yahoo.com.cn
2006-06-05 14:32 | 谭卿 [未注册用户]

#18楼    回复  引用    

我目前正在学习用.NET设计工作流引擎,看了很多资料都是理论上的东西,不知楼主能否发一份给我学习一下?谢谢!刚才打错字了,不好意思,重发一遍.
tanouq@yahoo.com.cn
2006-06-05 14:33 | 谭卿 [未注册用户]

#19楼    回复  引用    

近段时间发现了NXBre这个东西,但是资料实在太少。
能不能给我一份,谢谢!

zheng.xin.cn@gmail.com
2006-07-28 11:27 | ZhengXin [未注册用户]

#20楼    回复  引用    

谢谢了,比较感兴趣.
能发一份研究一下吗

zwscai@hotmail.com
2006-09-06 18:47 | Smith zhang [未注册用户]

#21楼    回复  引用    

刚接触工作流引擎,能像您学习一下!比较荣幸!谢谢!!!!!
2006-10-24 21:35 | 宏生 [未注册用户]

#22楼    回复  引用    

我也比较感兴趣啊!
yinoliver@gmail.com
2006-12-01 13:24 | Oliver [未注册用户]

#23楼    回复  引用    

急需要这方面的资料,能否给点,谢谢!
Msn:funstar@sina.com

#24楼    回复  引用    

楼主,我也急需这方面的资料,能发到我邮箱吗?谢谢了
tantting@126.com
2007-11-06 11:58 | tantting [未注册用户]

#25楼    回复  引用    

呵呵,我也来讨一份,谢谢
2007-11-17 09:12 | liushi [未注册用户]

#26楼    回复  引用    

非常感兴趣,应用场景和楼主的心得以及一些例子能否共享一下,谢谢
wjfksblk@hotmail.com
2007-11-28 10:54 | 知识万岁 [未注册用户]

#27楼    回复  引用    

最近在研究规则引擎,看了一下网上的材料都不起,能不能给我发一份,它的操作例子等. h.l-x@163.com 多谢
2008-02-22 11:45 | firedemoning [未注册用户]

#28楼    回复  引用  查看    

希望和楼博主交流
msn:mlzboy@yahoo.com.cn,不知可否告知一下msn
2008-05-06 09:36 | lexus      

#29楼    回复  引用  查看    

谢谢 博主
chenchen1981@hotmail.com
非常关注
2008-07-03 10:58 | 真水无香.chen