蓝雯飞,邢志宝,强小利
(中南民族大学 计算机科学学院,武汉430074)
一种Drools规则引擎封装模型及其实现
蓝雯飞,邢志宝,强小利
(中南民族大学 计算机科学学院,武汉430074)
针对Drools规则引擎的规则语法接受曲线陡峭,业务人员难以快速创建并维护规则等问题,提出了一种规则文件封装模型.同时,针对规则引擎API调用过程较为复杂,大量事实对象fact存在时引擎执行速度相当缓慢的问题,给出了一种Drools API封装模型.实验结果表明:封装后的Drools可以有效降低业务人员对规则学习与维护成本,并且明显提高了引擎执行速度.
规则;规则引擎;API封装
移动运营商每天产生的数据量大且复杂,以往的做法是人工直接核对,即利用手工为不符合规范的数据进行标记.对海量的运营数据进行人工核查几乎不可能.于是,有人尝试直接将各种核查规则直接编写成代码,形成了if-esle语句对组成的业务规则集[1].这样不仅容易出现逻辑与其它代码混乱,并且不利于对规则更新与管理,特别是在开发的过程中需求是不断变动的,一旦有规则发生改变则需要修改程序代码,并且需要经历编译、测试、发布等阶段.大量的业务相关代码不仅使得系统运行缓慢,维护规则更是耗费了巨大的人力和时间资源.规则引擎的出现能够很好地解决上述问题.规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.利用规则引擎,可以分离代码中的业务规则,实现业务人员制定规则并编写规则,业务规则的需求变更不再是困扰开发人员的问题[2,3].然而,应用规则引擎仍存在以下2个主要问题:(1)业务人员因规则在文件中以代码形式存在而难以编写与维护的问题;(2)因移动业务产生大量数据,带来规则引擎核查数据速度相当缓慢的问题.
本文以Drools规则引擎为研究对象.针对业务规则难以编写和维护的问题,通过图形化界面封装规则,屏蔽具体编写细节.针对大量数据核查速度缓慢的问题,通过工厂模式封装了Drools API,屏蔽具体调用细节.具体地,首先利JIDE组件形成人性化操作界面,并通过Java反射机制获取数据值对象的待核查属性列表,根据每个属性选取其规则匹配项,达到自动生成规则文件的目的.其次将规则基本信息作为一个类,包含了规则核查类型、创建时间、创建人、数据类型、规则文件、结果变量名称等,再将执行规则所需要的全部动作封装到一个RuleEngineService接口中,包含设置全局变量,插入事实对象,执行全部规则,回收内存等功能,并将回收内存的方法放在Java多线程里,能明显减少频繁回收内存的动作,从而提高规则引擎执行速度.
1.1 规则封装模型
为了简化业务人员学习规则引擎并维护业务规则,文章提出了对规则封装的模型.规则封装主要是针对when部分进行处理,即规则的左部分(LHS).规则封装模型如图1所示.
图1 规则封装模型Fig.1 Rule encapsulation model
规则封装实现步骤如下:
1)根据需求的领域模型编写需要进行核查的数据表的值对象;
2)以值对象为参数提供字段获取接口方法;
3)收集整理基站资源数据核查需求抽取与规则相关的业务逻辑;
4)利用JIDE组件设计规则封装界面.
规则封装后有如下几个方面的好处:
1)减少业务人员的学习成本.业务人员一般不理解规则文件的内容,通过本设计提出的规则封装管理系统,能够有效节省业务人员学习时间成本和资料查阅成本,使得业务人员有更多时间只做与业务相关的事情.
2)有效避免规则编写错误.即使是非常熟悉规则编写语法的开发人员在编写大批量的规则时也会因为不够仔细或者其它原因导致规则语法错误等问题.规则语法校对是一项比较费力的事情.在本规则封装管理系统中,业务人员只需要输入核心内容,不用考虑规则语法的细节.
3)良好的扩展性.通过Java反射机制获取值对象的全部属性[4],不用考虑值对象是已经存在的还是新增的[5].当需求变更,需要增加新的核查对象时,只需要为领域模型中新增的对象编写值对象,然后规则封装管理系统就可以智能的显示待核查的所有属性并为每个属性编写相关的核查规则.
4)创建与管理的高效性.业务人员通过图形化界面很容易创建新的规则与管理已经存在的规则.很短的时间便可以根据下拉列表中的规则匹配项名称生成一条规则.提高了规则编写、修改与创建的效率.
1.2 Drools API封装模型
规则编写好之后需要调用Drools规则引擎的相应API执行这些规则,在一般情况下是开发人员查阅Drools的API文档,通过编程逐步调用应用程序接口方法,这样比较耗费代码编写与调试时间.并且遇到数据量非常大的情况时,规则执行速度相当缓慢,严重影响执行速度.本文将执行规则的常用API封装起来,将使用多线程机制提高引擎执行效率,并形成一个专门的接口,以供开发人员直接调用接口来执行指定的规则.
引擎执行过程是首先解析规则文件[6],然后插入事实对象fact,再执行规则,最后释放规则所占用内存[7].这里,规则的执行是每插入一个fact就执行规则,并释放规则内存.这种频繁的规则的加载与释放过程占用了大量的时间,而这些工作并不是业务逻辑相关的.通过封装规则引擎常用API,开发人员不仅能够节省大量学习时间和查阅资料时间,还能够直接使用已经优化了的接口方法,提高引擎执行速度.图2给出了规则引擎封装的类图.
图2 规则引擎封装类图Fig.2 Class diagram for rule engine encapsulation
图2中,RuleInfo作为值对象拥有一个规则文件应有的属性,比如核查类型、创建时间、创建人、数据类型、规则文件、结果变量名称等.当然,作为POJO,RuleInfo还拥有其无参和有参构造函数以及相应的setter与getter方法.RuleEngineService接口提供了执行规则所需要的全部动作:设置全局变量,插入事实对象,执行全部规则,回收内存等.DroolsAdapt类主要用于实现RuleEngineService接口,即实现Drools真正需要完成的动作.最后,RuleEngineFactory作为工厂类,创建DroolsAdapt实例,为外界提供获取规则引擎操作的接口方法.下面是封装后的Drools执行代码.
final RuleEngineService ruleEngineService = RuleEngineFactory
.getRuleEngine();
……//解析excel数据表得到targetDatas
taskManageService = RmiServiceFactory.getInstance()
.getService(RMITaskManageService.class);
taskManageService.startSingleCheckTask(taskId, targetDatas);
TaskInfo task = taskManageService.getTaskInfoById(taskId);
通过将规则引擎封装起来,开发人员不需要考虑Drools的API调用细节,并且在调用过程中能有效避免重复的规则加载与释放过程.规则的执行可以直接调用DroolsAdapt里面的相应方法,为了实现在资源释放之前执行规则,最关键的部分是规则的释放时机,如下面代码所示.
new Thread(){
public void run() {
ruleEngineService.retract();
logger.infoT("singleTask[" + provinceManualVerifyTask.getTaskName()
+ "]释放资源.....ok");
ruleEngineService.dispose();
logger.infoT("singleTask[" + provinceManualVerifyTask.getTaskName()
+ "]释放完毕.....ok");
}
}.start();
以往的做法是每核查一个fact对象就释放内存资源,当数据量非常庞大、字段相当多的时候,频繁地释放会严重影响规则执行速度.把RuleEngineService接口中的资源回收方法dispose()丢到Java多线程里面,以保证所有fact对象全部核查完毕再释放内存,避免反复回收资源以及回收资源与引擎执行的切换调度时间.能够显著提高回收速度.这是一个空间换取时间的做法,因为这种方式需要更多的内存.
2.1 实验结果
实验主要在以JIDE组件形成的图形化界面上进行,实验包含两个部分:一是采用规则封装管理工具通过图形化的形式提供封装过的规则,二是通过调用规则引擎封装组件对基站资源数据进行规则校验,规则校验又分为单表核查和交叉核查,本文讨论单表核查下的实验.
实验1:规则封装组件自动生成规则,描述如下.
选择数据表对象,通过Java反射机制获取该数据表的所有字段,逐一选取字段.当选择某个字段“aa”时,系统自动为该字段的规则取名为“check the aa rule”,随后从规则匹配项下拉列表里面选取匹配项来满足该字段的核查要求,如果没有,则新建匹配项,存库,再调用.
图3是通过规则封装组件只能生成的规则文件,本设计将这些规则文件放到名为drl的文件夹之下,方便程序调用.实验表明,规则封装不仅能够节省业务人员大量的学习时间,并且能够避免因人为因素而导致的语法问题或规则匹配项的编写问题.
图3 规则文件Fig.3 Rule file
实验2:规则引擎封装组件进行数据核查,描述如下.
实验1已经成功生成了单表核查的规则文件,接下来需要使用规则引擎封装组件加载这些规则文件并执行规则.首先,新建单表核查任务,当数据表标题与标准标题完全匹配之后就可以开始进行单表核查.图4是GSM单表核查的结果.
图4 单表核查结果Fig.4 The result of checking a table
通过规则引擎加载规则文件对GSM表进行数据核查,找出错误的数据.图4中白底部分表示内容填写正确,而灰底部分表示内容填写错误,当光标聚焦到错误单元格的时候系统会提示正确的填写规范,这个提示信息是从规则文件中获取的.用户可以修改错误的信息并刷新重新核查,直到所有的数据都核查通过.
2.2 性能分析
图5给出了规则封装之后与直接编写规则文件时花费在各个部分的时间百分比.可以看出,直接开发规则文件时用在规则语法学习上的时间几乎占据总时间的一半,而维护规则的时间仅仅只占总时间的20%左右;封装规则后用于正则表达式与规则语法学习上的时间相对较少,大部分时间可以专注于规则的管理上,大大减少了与业务无关的学习时间与学习成本消耗.
图5 规则封装前后时间开销比较Fig.5 Time cost comparison
引擎测试实验运行环境如下:
(1)内存 4GB;(2)CPU 2.1GHz,双核,4线程;(3)操作系统 Windows 7.
图6比较了引擎封装前后的TD数据核查速度.由图6可以看到封装了规则引擎API后,在相同fact对象条数被引擎核查时,速度较之前大大提升.当数据量比较大,规则容易变更时,采用规则引擎能够大大降低开发成本.
图6 引擎封装前后执行速度比较Fig.6 Comparison of the engine execution speed
以上的研究工作也是开创性的,所以在对比实验数据时,仅用了封装前的数据和封装后的数据.实验结果表明,本文所采用的规则文件封装方案,缩短了业务人员学习规则语法的时间,简化了规则编写与维护过程,解决了业务人员不能很快着手编写规则的问题.本文所采用的规则引擎API封装方案,简化了开发人员调用引擎API的过程,提高了引擎的执行速度.
本文针对规则在实际应用过程中难以编写与理解的问题,提出了封装规则的有效方案,利用JIDE组件以及Java反射机制成功封装了规则文件,简化了业务人员学习与管理规则的过程.针对规则引擎耗内存大,大量数据核查速度缓慢的问题,提出了封装Drools API的有效方案,利用JIDE组件以及Java多线程机制成功封装了常用API,简化了开发人员使用Drools的过程,并提高了引擎执行速度.论文对推动规则引擎的普及,将规则引擎更加广泛地应用到工业界中具有一定的实际意义.
虽然论文研究的封装模型可以较好地降低业务人员对规则引擎的学习成本,提高开发人员的编码效率,但是规则引擎封装仅限于对单数据表核查规则,下一步的研究内容是方便开发人员的同时,进一步封装多数据表交叉核查规则.
[1] 郭 芳, 白建军. 基于 Rete 算法的规则引擎 JBoss Rules [J]. 计算机时代, 2008, 1(1): 8-10.
[2] Razzaq A, Hur A, Masood M, et al. Foundation of Semantic Rule Engine to Protect Web Application Attacks[C]// Masaki. 2011 10th International Symposium on Autonomous Decentralized Systems. Tokyo: Tokyo University Press, 2011: 95-102.
[3] 朱先飞. Drools 在电信网络开通系统中的应用及其改造[J]. 广东通信技术, 2007, 27(11): 6-8.
[4] 张聪品, 刘 超. 基于 Java反射机制的规则引擎设计与实现[J]. 河南师范大学学报: 自然科学版, 2010, 38(03): 36-39.
[5] 费廷伟, 刘淑芬, 屈志勇, 等. Java 反射驱动的规则引擎技术研究[J]. 计算机应用, 2010, 30(05): 1324-1326.
[6] 陆歌皓,李仕金,吴超凡. Drools 规则引擎在现代物流信息平台的应用[J]. 计算机科学, 2011, 38(B10): 447-450.
[7] 缴明洋,谭庆平. Java 规则引擎技术研究[J]. 计算机与信息技术, 2006(3): 41-43.
[8] 李春芳, 谭庆平, 徐建军, 等. 基于业务规则的工作流任务分派设计与实现[J]. 计算机工程与设计, 2008, 29(21): 5572-5575.
[9] 赵万平,于晓红,曲 宝. 基于JESS的智能数据清洗平台技术研究[J]. 牡丹江师范学院学报,2006,31(03): 11-13.
[10] 闫丽萍,潘正运,梁 冰,等. 基于业务规则管理技术的系统开发方法分析[J]. 信息工程大学学报, 2006, 7(2): 141-143+171.
[11] 赖天武,吴伟民,王 静,等. 基于Jess 和机器学习的 Robocode 策略研究与实现[J].系统仿真学报,2006,18(2): 912-914.
Research on Encapsulation Model to Drools Rule Engine
LanWenfei,XingZhibao,QiangXiaoli
(College of Computer Science, South-Central University for Nationalities, Wuhan 430073, China)
Rule grammar
curve of business engine is steep. It’s hard for business personnel to quickly create and maintain rule. The paper brings up a model for encapsulating rule file. Besides, API calling process of rule engine is complicated. The engine performing speed becomes rather slow when many fact objects exist. The paper puts forward a model for encapsulating Drools API. Experiments show that the encapsulated Drools can not only effectively reduce the business personnel of rule learning and maintenance costs, but also improve the engine execution speed.
rule; rule engine; API encapsulation
2015-08-10
蓝雯飞(1966-),女,教授,研究方向:数据库技术,软件新技术,E-mail:lanwenfei1@163.com
国家自然科学基金资助项目(61379059)
TP311
A
1672-4321(2015)03-0095-05