用规则引擎替换代码

    业务规则管理系统的基本原理是:用一个或多个规则引擎替换以程序代码“固化”在应用系统中的业务逻辑。一个完善的vrs可以对业务规则的整个生命周期实现全程管理。

业务规则管理如何实现?

业务规则

一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑。业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技术人员使用面向对象的技术语言或脚本来定制。业务规则的理论基础是:设置一个或多个条件,当满足这些条件时会触发一个或多个操作。

规则引擎

VisualRules是用 Java 语言编写的商业规则引擎。VisualRules允许使用声明方式表达业务逻辑。可以使用独有的本地语言编写规则,从而便于学习和理解。并且,还可以将 Java 代码直接嵌入到规则文件中,这令 VisualRules的学习更加吸引人。VisualRules还具有其他优点:
非常健全的技术支持
易用
快速的执行速度
规则编译为Java代码,跨平台
超过10年的专注研发投入
商业化的售后服务,使产生问题得到更好的处理


规则引擎对人员的要求

    VisualRules从产品最初设计开始,就非常关注如何使用户使用简便,减少用户的工作量。
在用户的操作界面上,VisualRules对不同的操作员针对性的提供一些特定的功能。比如为开发人员提供了生成开发人员所熟悉的java语言,让开发人员可以用自己熟悉的语言更加深入的理解业务逻辑;为业务人员和管理人员提供了业务语言和流程图,可以用业务人员自己的语言来理解业务逻辑。另外VisualRules还提供了规则树的功能,就是可以以树状的形式定义了相关规则的相互关系,包括公共条件关系、循环关系、先后关系等。让用户在编辑规则阶段,就清晰的指导了规则执行的流向。

    VisualRules针对国内项目基本都是基于数据库系统的特点,集成了数据库层,并且实现了数据库层的随时变更。还增加了大量的向导功能,以帮助用户可以非常方便的在规则中操作数据库。另外又可以让用户可以直接在编辑界面执行规则,这些规则执行的数据可以是测试数据。同时又提供了数据查阅的功能,可以直接在编辑界面就可以看到原始数据和规则执行后的结果数据。这些功能都使得用户可以非常方便的定制规则。

    VisualRules针对规则变化时,可能导致规则包接口的变化。将接口采用map方式来存储,这样就使得所有规则包的接口都可以随时修改。同时结合了代码生成技术,可以为技术人员生成其他相关的程序代码,包括jsp代码、以及其他的java类代码。这样可以让技术人员仅仅通过配置页面,就可以生成一个完成的调用规则的应用。
VisualRules针对不同的用户,提供了不同的版本,下面讲述具体版本中VisualRules有具有的优点。针对技术人员,VisualRules提供了规则编辑器开发人员版,开发版有如下优点:

单个文件集中管理规则包相关的所有规则和业务对象
    开发人员可以在同一个规则包中,处理和此规则服务相关的所有参数、数据来源、技术和业务词汇、业务规则。
而JRules等产品,却需要在不同的地方定义XOM、BOM、RULESET、RULE等,你很难在一个统一的地方全面的把握住该规则服务所需要的所有的业务规则和业务对象。集中统一的管理,可以极大地为用户提供便利,减少开发工作。
         
面向规则包的版本控制
    同时集中统一的管理也为规则包的整体版本控制提供了可能。很多实际业务要求,同一规则服务,会在不同的时间段或者不同的条件下,会调用不同的版本(也就是具体其中某几个规则会有所不同),而这几个版本可能是同时都要有效的。因此需要针对规则包进行统一的版本控制。
而目前像JRules等产品,只能提供规则级别的版本控制,不能做到整个规则包级别的版本控制。
支持规则分支、循环类规则
    在实际的业务规则实践中,总是会出现某些规则是只有满足某个公共条件才触发的,也会出现某些规则是在某个循环中的。VisualRules可以在规则集中设置公共条件或者是循环条件,以满足规则集下面的所有规则必须满足公共条件才能执行,或者是循环执行的。
    而像JRules等产品的规则集,不能设置工作条件和循环条件,因此JRules不能对规则的执行进行有效的分支控制。很多时候其需要通过为每个规则设置大量的条件或者通过临时变量等变通的方式来解决,这样的解决方式非常牵强,就不能体现业务语言表述业务逻辑的特点了。

编辑阶段的Java代码对照生成
    由于技术人员使用规则编辑器,其更多的关注实际业务逻辑对应的技术映射是否正确,因此技术人员更加关注业务逻辑对应生成的java程序代码,而技术人员如果已经有java语言的基础的话,那么查看生成的java代码会比看中文化业务逻辑更加直观和便于理解。其原因也显而易见,因为中文描述的业务逻辑,同样一句话可能在不同的环境下,是不同的技术实现。因此如果要关注具体的实现细节,则需要查看实际的代码。VisualRules可以自动实时的生成对应的java代码,这会在测试以及查错方面给予很大的帮助。
    而JRules等产品,只能看到TRL语言,这就要求技术人员重新学习一种新的语言,也不好理解。

支持规则包整体测试
    VisualRules可以在编辑环境下,直接对规则包进行整体测试。测试时只需输入所需的参数的值,就可以查看到输出结果,以及可以看到整个规则执行路径以及对应的数据变化情况。这样就可以非常方便的对规则包进行测试检查,或者对下面的某个规则或者规则集单独进行检查。

    而JRules等产品必须要在eclipse等开发工具下,单独编写相应的java程序来驱动规则包的执行以及进行调试测试,这使得测试等工作变得非常困难(比当初采用编码方式实现业务逻辑进行调试一样困难)。
支持规则集、规则的单元测试
VisualRules可以在编辑环境下,对规则集、规则、决策表等进行单元测试。这样就使分块查错变得非常容易。
而JRules等产品根本不支持单元测试等操作,除非另外增加一个只包含需要测试的规则的规则包来进行测试,这样就变得非常困难。

支持规则执行轨迹跟踪
    当规则包被调用时,有时候用户需要知道这次调用到底激活了那些规则,他们的先后执行顺序,以及调用此规则时,对业务对象的修改情况(进规则之前,业务对象什么状态,经过规则执行之后,业务对象变成了什么状态)。VisualRules可以将所有当次运行的这些规则执行轨迹记录下来,供用户进行查阅,或者存储在数据库中,供以后查阅。这在用户进行规则的查错时非常有用,可以马上定位到底是运行到那个规则时,发生了错误。
而JRules等没有提供这方面的功能。他只能通过调试来实现。

支持规则异常处理
    VisualRules可以针对规则定义多种异常处理方式,通过设置规则属性就可以。这样就可以在规则内部处理异常情况。
    而JRules等只能在规则包级别进行异常的处理情况。

支持动态的规则包调用接口
    VisualRules支持外部调用直接以数值、字符串、类对象等多种方式将参数传入到规则包中,这样就使得接口的参数动态化。特别是当采用规则服务方式时,如果变动接口,不用去修改原先调用它的各个程序。
而JRules等必须要以类属性的方式来传递参数,这样就使得参数的传递不能动态化,规则服务接口不能方便的发生变化。

集成了动态OR映射
    VisualRules从一开始就充分考虑基于数据库的项目的特点,大量的规则判断依据(比如参数以及原始数据、或者结果数据)都需要来源于数据库,因此VisualRules在业务规则处理的业务对象中,无缝集成了数据库层的操作。让规则操作数据库中的数据就像处理一个普通的业务对象一样方便,并且让数据库对象也像规则一样,可以随时改变。
而JRules等产品,却通过类对象来访问数据库,这样就不能使得数据库对象不能轻易进行变动,也使得操作和访问数据库变得非常困难。

基于JSP的业务系统操作界面自动生成
    VisualRules可以在规则编辑界面配置生成调用此规则包的JSP页面,这样就可以轻松的完成操作界面的生成工作。这有点类似工作流中的表单设计器。只不过工作流中的表单设计器,相对参数比较固定,格式也统一。而VisualRules的页面配置器,却可以根据模板设计的不同,而生成针对不同项目特点的页面。JSP页面的生成使得测试规则变得更加容易,甚至可以用此功能轻松的开发完成一个完整的基于数据库的管理系统。
而JRules等工具却并不提供这类功能。

VisualRules专门针对业务人员提供了 规则配置器编辑人员版,编辑版具有如下特点:

    带有用户身份认证的完整的规则编辑功能
编辑版由业务人员进行使用,必须经过用户名和密码的身份认证。这种身份认证可以和业务系统结合。并且通过规则的权限分配,用户只能查看和修改自己具有权限的规则。这就保证了规则修改的安全性。
而像JRules等工具并不能为业务人员直接提供一个完整的具有严格的身份认证的规则编辑器。其只能通过其自身的规则管理系统来进行操作。这就使得技术人员和业务人员的操作界面等不一致,增加了沟通的难度。

支持业务人员直接测试规则包和规则
    对于规则包的整体测试,或者对于规则、规则集的单元测试,也在编辑版中提供。这样就使得业务人员直接可以在修改规则的过程中测试规则设定的正确性。
    而JRules等产品需要通过调试等手段来检验规则的正确,这样就只能由技术人员才能测试规则以及验证其正确性。

编辑阶段可查看来源数据
    编辑版不能对对象库中的数据库层进行操作,也就是说不能直接操作数据库。但是可以提供功能供用户直接查看来源数据,这样业务人员在编辑规则时,如果需要查询数据,就不需要通过报表系统去查询,直接在编辑界面就可以查看对应的数据库中的来源数据,这样可以大大减轻开发的工作。
而JRules等产品,并不提供这类功能。

支持多种样式的决策表
    VisualRules针对国内决策表的特殊情况,设计了多种决策表,包括表格类决策表、多维决策表、关联决策表。当然也可以根据业务系统的实际需要进行扩展。这些不同类型的决策表,使得业务人员可以更加简单方便的表述业务逻辑。
    而JRules只提供了一种决策表的实现,而且这种决策表在描述国内的业务需求时,并不能很好的进行描述。

支持规则包的流程图显示
    VisualRules可以在编辑阶段直接生成一个包含了全部业务逻辑以及流向的流程图,这个流程图可以导出成html,发送给相关的人员查阅或者审批。这使得业务人员可以在一副图中,看到所有相关的信息,非常符合中国人的思路,易于国人理解。在具体的流程显示时,还可以将只有技术人员才关心的一些规则隐藏起来,让流程图只显示和业务相关的逻辑。
    而JRules只能提供局部流向图,并不能将具体的规格内容包含在其中,也不能在一副图中描述整个流向图。

支持用户修改轨迹记录
    VisualRules在规则编辑阶段,在修改用户的信息记录在被修改的规则文件中。这样就可以跟踪到某个规则,在什么时候被谁进行了修改。
    而JRules等产品,却并没有对编辑用户的信息进行记录。
    总的来说,VisualRules针对国内用户的特点以及基于数据库项目的特点,增加了很多易用性方面的功能。这些功能大大的简化了用户的工作,真正的将业务规则的编写可以由业务人员来设定和审阅。另外VisualRules可以针对国税系统的情况,完善国税系统所需要的各项功能,以求最大限度地满足国税系统的需要。

规则引擎的内部实现

     规则引擎的基本机制是:对提交给引擎的数据对象进行检索,根据这些对象的当前属性值和它们之间的关系,从加载到引擎的规则集中发现符合条件的规则,创建这些规则的执行实例。这些实例将在引擎接到执行指令时、依照某种优先序依次执行。一般,规则引擎内部由下面几个部分构成:工作内存,用于存放被引擎引用的数据对象集合;规则执行队列,用于存放被激活的规则执行实例;静态规则区,用于存放所有被加载的业务规则,这些规则将按照某种数据结构组织,当工作区中的数据发生改变后,引擎需要迅速根据工作区中的对象现状,调整规则执行队列中的规则执行实例。

猜你喜欢

转载自silencelight.iteye.com/blog/2249363