论坛首页 Java企业应用论坛

规则引擎

浏览 114922 次
锁定老帖子 主题:规则引擎
该帖已经被评为精华帖
作者 正文
   发表时间:2004-09-24  
引用
ERP里面比较复杂的排程和诸如电信行业的价格、大医院的排班等等在国外早就采用规则引擎来做了


用规则引擎来实现可运行时修改的业务规则。 这样可得到高度灵活性的软件, 更好的动态适应业务变化。

思想上应该是这样,实践中还没有机会用过。

问一个实践问题, 通常规则引擎与 OO的代码是怎么集成在一起工作的?

谢谢。
   发表时间: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
1 请登录后投票
   发表时间:2004-09-25  
非常感谢. 还有一个问题:
RuleEngine 是来自 java 的标准库, 还是第三方.
0 请登录后投票
   发表时间:2004-09-25  
如果我想自己选择某条规则, 而不是让rule engine 去匹配, 怎么做?  尤其是在可能会有多条规则匹配的情况下怎么选择?
0 请登录后投票
   发表时间: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代码不改一个字,这位机器人司机就会自动对慢吞吞的行人口吐三字经了。所谓“人工智能”、“专家系统”,就是这么进化的。
3 请登录后投票
   发表时间:2004-09-25  
受益非浅,规则引擎是否能从业务变动大的地方延伸到普通的cms来呢?比如对bbs的权限管理,jive里用的是filter,如果用规则引擎来做,既修改规则,达到控制所有用户呢?规则匹配的速度能满足多用户并发访问的要求吗?
0 请登录后投票
   发表时间:2004-09-25  
alin_ass 写道
受益非浅,规则引擎是否能从业务变动大的地方延伸到普通的cms来呢?比如对bbs的权限管理,jive里用的是filter,如果用规则引擎来做,既修改规则,达到控制所有用户呢?规则匹配的速度能满足多用户并发访问的要求吗?


filter跟规则引擎是不矛盾的,规则引擎取代的是复杂的if...else...结构。速度是不成问题的,采用rete算法的引擎模式匹配都很快,我记得有个数据是JESS每秒可以做数十万次模式匹配。
1 请登录后投票
   发表时间:2004-09-25  
谢谢。

gigix 写道:
引用
有N条规则与事实库匹配,就执行N条规则的行为

规则引擎会去执行 action。
我想相应的action 应该 是在我的代码中实现的。 我的意思是, 应该有从 RuleEngine 到我的 OO 代码中的action  的调用机制。 类似于回调。

是这样吗?如果有, 是怎么实现的?
0 请登录后投票
   发表时间:2004-09-25  
JESS可以调用任何Java对象,只要在CLASSPATH能找到就行。但通常是由规则引擎对传入的对象再做某些操作,而不会自己主动去找别的对象。比如执行“买书”的行为,就在传入的用户对象上扣50块钱、用户的书增加一本。
0 请登录后投票
   发表时间:2004-09-25  
我总觉得规则引擎这个概念挺起来是个很高深的事情,java里面是怎么回事我并不清楚。

我曾考虑过把业务系统抽象成一系列规则的组合,不过这里面难度好像挺大的,主要的困难在于独立的业务规则之间如何交互和通信的问题,因为业务系统有可能是一个变化极快的系统,因此如何制定一个足够灵活和简单的规则体系就很不简单。

不知道这里说的规则引擎和我想象中的业务规则引擎是否是不同的?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics