深入理解规则

 
1.问:使用规则引擎的方式有哪些?
由于规则引擎是软件组件,所以只有开发人员才能够通过程序接口的方式来使用和控制它,规则引擎的程序接口至少包含以下几种API:加载和卸载规则集的API;数据操作的API;引擎执行的API。开发人员在程序中使用规则引擎基本遵循以下5个典型的步骤:
创建规则引擎对象;
向引擎中加载规则集或更换规则集;
向引擎提交需要被规则集处理的数据对象集合;
命令引擎执行;导出引擎执行结果,从引擎中撤出处理过的数据。
使用了规则引擎之后,许多涉及业务逻辑的程序代码基本被这五个典型步骤所取代。
一个开放的业务规则引擎应该可以"嵌入"在应用程序的任何位置,不同位置的规则引擎可以使用不同的规则集,用于处理不同的数据对象。此外,对使用引擎的数量没有限制。
2.规则引擎大概是如何运作的?
规则引擎的推理步骤如下:a. 将初始数据(fact)输入至工作内存(Working Memory)。b. 使用Pattern Matcher将规则库(Rules repository)中的规则(rule)和数据(fact)比较。c. 如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合。d. 解决冲突,将激活的规则按顺序放入Agenda。e. 执行Agenda中的规则。重复步骤b至e,直到执行完毕Agenda中的所有规则。
任何一个规则引擎都需要很好地解决规则的推理机制和规则条件匹配的效率问题。
当引擎执行时,会根据规则执行队列中的优先顺序逐条执行规则执行实例,由于规则的执行部分可能会改变工作区的数据对象,从而会使队列中的某些规则执行实例因为条件改变而失效,必须从队列中撤销,也可能会激活原来不满足条件的规则,生成新的规则执行实例进入队列。于是就产生了一种"动态"的规则执行链,形成规则的推理机制。这种规则的"链式"反应完全是由工作区中的数据驱动的。
规则条件匹配的效率决定了引擎的性能,引擎需要迅速测试工作区中的数据对象,从加载的规则集中发现符合条件的规则,生成规则执行实例。1982年美国卡耐基·梅隆大学的Charles L. Forgy发明了一种叫Rete算法,很好地解决了这方面的问题。目前世界顶尖的商用业务规则引擎产品基本上都使用Rete算法。
3.规则引擎94jsrAPI包括哪些部分?
Java规则引擎API分为两个主要部分:运行时客户API(the Runtime client API)和规则管理API(the rules administration API)。
1规则管理API
规则管理API在javax.rules.admin中定义,包括装载规则以及与规则对应的动作(执行集 execution sets)以及实例化规则引擎。规则可以从外部资源中装载,比如说URI,Input streams, XML streams和readers等等.
运行时API
运行时API定义在javax.rules包中,为规则引擎用户运行规则获得结果提供了类和方法。运行时客户只能访问那些使用规则管理API注册过的规则,运行时API帮助用户获得规则对话并且在这个对话中执行规则。
4.为什么在irules中会有springmodule的影子?
答:这个很简单,你想想看,spring这个玩意出来的目的就是为了对实现与接口进行解耦的,各个厂家的规则引擎都不一样,为了使用户在换规则引擎实现的时候不必改动客户端代码,所以就弄出个springmodules,里面有专门的API负责规则引擎这块的解耦工作!
5.听说里面用到了一些回调代码,怎么回事?能不能演示给我们看看?
答:是的,我们在package org.springmodules.jsr94.core包的public class Jsr94RuleSupport类中可以看到以下代码,是典型的有关回调的:
       /**
               * Executes rules given the uri, properties, list of input objects and optional filter
               *
               * @param uri The ruleset uri
               * @param properties The ruleset execution properties
               * @param input The input facts
               * @param filter The object filter (can be null)
               * @return List of inferred facts
               * @see #executeStateless(String, List)
               * @see #executeStateless(String, List, ObjectFilter)
               */
       protected List executeStateless(final String uri, final Map properties, final List input, final ObjectFilter filter) {
              return (List) template.executeStateless(uri, properties, new StatelessRuleSessionCallback() {
                     public Object execute(StatelessRuleSession session) throws InvalidRuleSessionException, RemoteException {
                            List result;
                            if (filter != null) {
                                   result = session.executeRules(input, filter);
                            }
                            else {
                                   result = session.executeRules(input);
                            }
 
                            return result;
                     }
 
              });
       }
大家可以看到,上面标红色的字体是一个回调类,他座位参数直接传到了executeStateless中,这个callback类里面重写了自己的一个execute方法,预先把参数input和filter传入,而在执行完executeStateless方法时会产生一个StatelessRuleSession 座位参数传入到execute中,这样就完成了一个回调过程了!
6.怎么理解ruleset的概念以及到底客户类也就是说我们的程序员如何编写代码来用我们的规则引擎?
答:所谓的ruleset就是针对某一场景下的规则的集合,比如说足球比赛他有一个规则集,这个规则集只能试用于这个足球比赛,有关足球比赛的犯规情况你随便抓些事实作为条件输入,都会得到相应的判罚结果,但是你把篮球比赛的事实作为输入足球的规则集,显然,你什么都匹配不上,因为根本就不对应,这样一说大家肯定明白了,当你把使用规则引擎的时候,条件与规则集是两个必须的参数,因为只有规则集锁定了,你的相应的条件才有意义!所以客户端代码写起来就会是类似这样的样子:executeStateless(uri, input)。uri是使用的规则集,input是条件!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值