锁定老帖子 主题:规则引擎
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-09-24
引用 ERP里面比较复杂的排程和诸如电信行业的价格、大医院的排班等等在国外早就采用规则引擎来做了
用规则引擎来实现可运行时修改的业务规则。 这样可得到高度灵活性的软件, 更好的动态适应业务变化。 思想上应该是这样,实践中还没有机会用过。 问一个实践问题, 通常规则引擎与 OO的代码是怎么集成在一起工作的? 谢谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-09-24
armlinux-w 写道 问一个实践问题, 通常规则引擎与 OO的代码是怎么集成在一起工作的?
你编写的规则文件规定了一个规则库(rule base);Java程序在运行时把一堆对象传递给规则引擎,这些对象构成了一个事实库(fact base);规则引擎根据事实库里的诸事实到规则库里去做模式匹配,匹配到哪条规则就执行哪个操作。简单说大概就是这样: RuleEngine engine; List facts; // insert all the facts of the world, e.g. // facts.insert(user);; // facts.insert(bookstore);; // etc. engine.execute(facts);; // now you can get the result, i.e. // objects which is processed by rules |
|
返回顶楼 | |
发表时间:2004-09-25
非常感谢. 还有一个问题:
RuleEngine 是来自 java 的标准库, 还是第三方. |
|
返回顶楼 | |
发表时间:2004-09-25
如果我想自己选择某条规则, 而不是让rule engine 去匹配, 怎么做? 尤其是在可能会有多条规则匹配的情况下怎么选择?
|
|
返回顶楼 | |
发表时间:2004-09-25
armlinux-w 写道 非常感谢. 还有一个问题:
RuleEngine 是来自 java 的标准库, 还是第三方. JSR-94规定了规则引擎的Java API,但没有规定用哪种语言描述规则。现在已经实现的规则描述语言有JESS、XML和Groovy等,可能还有些商业产品实现了自己的规则描述语言。我个人认为JESS是这里面比较好的一种。 armlinux-w 写道 如果我想自己选择某条规则, 而不是让rule engine 去匹配, 怎么做? 尤其是在可能会有多条规则匹配的情况下怎么选择?
首先回答你第二个问题:你不选择。有N条规则与事实库匹配,就执行N条规则的行为。所以你才可以拥有rule-based的灵活性。不过你可能需要为规则指定优先级,以防行为之间出现冲突。比如说,“开车”的规则有说“如果绿灯亮,前进”,也有说“如果前方有人,停车”,那么既有绿灯又有行人时该怎么办呢?你就必须指定第二条规则优先级高。但这些都是在规则里面定义好的,你不应该在运行时干预规则引擎。 所以第一个问题的答案是:你不应该自己选择。如果你要自己选择,那不就回到了原来的做法、在程序里写一大堆if...else...吗?那还要规则引擎来干什么呢?还是用上面这个例子,你可以再加上一条规则:“如果(绿灯亮 并且 前方有人),问候车前行人的母亲”。于是,你的Java代码不改一个字,这位机器人司机就会自动对慢吞吞的行人口吐三字经了。所谓“人工智能”、“专家系统”,就是这么进化的。 |
|
返回顶楼 | |
发表时间:2004-09-25
受益非浅,规则引擎是否能从业务变动大的地方延伸到普通的cms来呢?比如对bbs的权限管理,jive里用的是filter,如果用规则引擎来做,既修改规则,达到控制所有用户呢?规则匹配的速度能满足多用户并发访问的要求吗?
|
|
返回顶楼 | |
发表时间:2004-09-25
alin_ass 写道 受益非浅,规则引擎是否能从业务变动大的地方延伸到普通的cms来呢?比如对bbs的权限管理,jive里用的是filter,如果用规则引擎来做,既修改规则,达到控制所有用户呢?规则匹配的速度能满足多用户并发访问的要求吗?
filter跟规则引擎是不矛盾的,规则引擎取代的是复杂的if...else...结构。速度是不成问题的,采用rete算法的引擎模式匹配都很快,我记得有个数据是JESS每秒可以做数十万次模式匹配。 |
|
返回顶楼 | |
发表时间:2004-09-25
谢谢。
gigix 写道: 引用 有N条规则与事实库匹配,就执行N条规则的行为
规则引擎会去执行 action。 我想相应的action 应该 是在我的代码中实现的。 我的意思是, 应该有从 RuleEngine 到我的 OO 代码中的action 的调用机制。 类似于回调。 是这样吗?如果有, 是怎么实现的? |
|
返回顶楼 | |
发表时间:2004-09-25
JESS可以调用任何Java对象,只要在CLASSPATH能找到就行。但通常是由规则引擎对传入的对象再做某些操作,而不会自己主动去找别的对象。比如执行“买书”的行为,就在传入的用户对象上扣50块钱、用户的书增加一本。
|
|
返回顶楼 | |
发表时间:2004-09-25
我总觉得规则引擎这个概念挺起来是个很高深的事情,java里面是怎么回事我并不清楚。
我曾考虑过把业务系统抽象成一系列规则的组合,不过这里面难度好像挺大的,主要的困难在于独立的业务规则之间如何交互和通信的问题,因为业务系统有可能是一个变化极快的系统,因此如何制定一个足够灵活和简单的规则体系就很不简单。 不知道这里说的规则引擎和我想象中的业务规则引擎是否是不同的? |
|
返回顶楼 | |