
应用研究
与皮
可配置Drools 规则引擎及其在征税系统应用研究
夏平平
(江苏海事职业技术学院信息工程系江苏南京211170)
摘要:传统应用信息系统开发过程中往往把业务规则通过硬端码写入程序中,当业务规则发生变化或改变,系统修改代来的代价非常大。论文介绍了可配置Drool规则引季的实现过程,实现系统之间的松耦含,提高系统业务规则的可配置。
关键词:Drook业务规则规则引擎中图分类号:TP311.52
文献标识码:A
1引言
文章编号:1007-9416(2013)11-0060-01
3.2业务规则的启动
首先要初始化相关规则引擎和环境变量,然后加载taxassist.
在征税系统开发过程中,需要定义匹配的业务规则,比如企业名称的长度,合伙纳税人比例情况,外资企业比重情况等等,虽然可以通过源代码的方式实现这些业务规则,但是随着国家税制的改革和完善,征税方面的业务规则势必会经常变化,必然导致程序需要二次修改和重新部署,给维护工作带来非常大的不便。本文给出了使用Drools规则引擎如何实现可配置的规则实现过程,可以很好的解决上述问题。
2应用Drools规则引擎开发征税系统规则的设计
根据drools规则引擎的开发原则,设计如下的征税系统规则框架,见图1所示。
在图1中,Drools规则引擎组件调用征税规则信息对象和纳税人信息对象,对象之间有一定的关联关系,征税规则文件定义在 taxasist.dwl文件中,在该文件中可以使用java编码的方式实现业务规则的定义。
3应用Drools规则引擎开发征税系统规则的实现
3.1规则文件的实现
根据Drools规则文件的结构,一般遵循如下语法: rule"规则名称"when[LHS]】then[RHS] end
这里的LHS是条件部分,RHS是结果部分,可以采用java编码的方式,也可以调用正则表达式,部分核心代码如下所示,
rule"1023 when
info : Jgnsr(null != zxdz && zcdz not matches "[V>u4e00 >u9fa5](4,")
then
NSRError error = new NSRError(O),
error. setRuleName(drools getRule(), getName(),
errorsetName("单位纳税人、个体经营户注册地址长度检查"), error.setValue("注册地址长度是:"+info.getZcdz).length0); error.setDesc("单位纳税人,个体经营户注册地址不应少于4
个汉字。"),
TaxDroolsMgr, addNSRError(error); end
税务规则信息对象
Drols规则引单组件
纳税人信息对象
税务规测文件≤
图1征税系统规则框架图
drl引擎文件,针对每个业务规则,调用规则进行匹配性检查,如果发现不满足,那么放入NSRError集合中,这样可以在视图层显示邸条规则不符合。核心代码如下:
TypeMgr.initAlITypeO)
TaxDroolsMgr mgr = new TaxDroolsMgr(),//初始化相关规则引擎和环境变量
List
listTargets = new ArrayList(),
List listResults = mgr,runCheck("taxassist. drl",listTargets);//该集合是放人不匹配的规则信息
listTargets. add(nsr),
for(NSRErrorerror:listResults)//输出所有的不匹配错误规则
ISystem, out. println(error .getRuleName()+*_"+error. getName()+"_"+error - getValue()+*_" +error . getDesc(),
3.3可配置Droos规则引擎的实现
虽然可以在规则引擎配置文件(taxassist.drl)定义业务逻辑,实现不需要重新编译源代码的情况下,可以更改业务逻辑,但是这种方式仍然有一定的缺陷,比如用户希望使用程序动态更新规则引擎配置文件内容,实现方法有多种,比较常见的方法是程序重写taxassist. drl文件内客,需要用到iava文件流来实现,代码的核心就是按照drl文件的规范来动态覆盖原来文件内容即可。其核心代码如下:
for (Drools d : list) bw, write("rule *"),
String s = d.getDroolsid()+"* ",
bw,write(s), bw,newLine();
bw,write("when"); bw,newLine(),
bw, write(d.getDwhen(); bw,newLine();
bw, write("then"); bw.newLineO,
bw,write(d.getDthen(),
bw,newLine(), bw,write("end"); bw,newLine();
参考文献
[1]郑文恩.陆铭华,肖明彦.应用规则引擎构建舰艇作战决策系统方法研究[J].舰船电子工程,2012,32(23):3-5.
[2]杨飞.承会兵,马和.基于DrooIs的路面智能养护系统的研究与实现[J].交通科技,2013(4):78-80.
备注:江苏省高等职业院校高级访工程师计划资助项目(2013),项目编号:FG150. 60