APP下载

基于Java注解的Drools业务规则开发框架设计实现

2017-06-01周中雨,李洋,杨程屹

电子测试 2017年6期
关键词:引擎代码逻辑

基于Java注解的Drools业务规则开发框架设计实现

0 引言

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。规则引擎接受数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎适用于业务规则复杂且频繁改动的系统。

Drools是RedHat公司旗下一款基于Java语言的开源规则引擎,广泛应用于金融、保险、电信等领域,可以将复杂多变的规则以规则脚本的形式存放在文件中,使得规则的变更不需要重启机器就可以立即在线上环境生效。

在业务规则开发过程中,Drools规则引擎只能识别与处理基于DRL(Domain Rule Language)格式定义的业务逻辑,与Java程序相比存在着一些缺陷,不能很好地支持企业级应用管理,主要表现在以下两方面。

(1)开发效率待提高:DRL语法学习成本较高;传统Java开发环境(例如Eclipse)不支持对DRL进行语法检查和语法辅助,无法在运行前发现语法错误;部分规则文件无法进行调试;重构难度大,进行规则修改时很难评估影响范围。

(2)代码质量缺乏保障:无法通过代码质量管理工具(例如SonarQube)对DRL文件进行检查与分析。

为解决这些缺陷,迫切需要建立Drools业务规则开发框架,直接使用Java语言实现业务逻辑,单元测试通过后自动生成Drools业务规则。

1 开发框架设计

Drools业务规则开发框架主要由编写模块、执行模块、转换模块三部分组成。其中编写模块定义Java语言实现业务逻辑的规范;执行模块对Java语言实现的业务逻辑模拟执行,并支持在传统Java开发环境中进行代码调试;转换模块将Java语言实现的业务逻辑转换成Drools规则引擎支持的业务规则。

Drools业务规则开发框架的使用流程如图1所示。

图1 Drools业务规则开发框架的使用流程

通过使用此开发框架,技术人员直接使用Java语言实现业务逻辑,将极大提高开发效率和代码质量。

下面介绍Drools业务规则开发框架的实现技术。

2 开发框架实现

2.1 Java注解技术

注解(annotation)是JDK1.5及以后版本引入的一个特性。注解(annotation)是一个接口,程序可以通过反射来获取指定程序元素的注解对象,然后通过注解对象来获取注解里面的元数据。

元注解(meta-annotation)的作用是负责注解其他注解。Java5.0定义了4个标准的元注解类型,它们被用来提供对其它 注解类型作说明。其中元注解@Target说明了注解所修饰的对象范围,元注解@Retention定义了该注解被保留的时间长短,分为三种情况:SOURCE表示出现在源代码中但被编译器丢弃;CLASS表示编译在class文件中但在class文件装载时被忽略;RUNTIME表示编译在class文件中且在class装载时被读取。

Java注解技术对于Drools业务规则开发框架至关重要。基于注解技术,执行模块获取代码中的元注解信息从而动态执行Java代码,转换模块获取代码中的元注解信息从而完成代码分析从而转换为DRL文件。

2.2 编写模块

编写模块中定义了三种注解,分别为RuleGroup、Rule、RuleFunction,这三种注解的@Retention都设置为RUNTIME,以便在执行模块及转换模块中获取注解信息。

RuleGroup标识在规则流中所属的节点,定义如下:

@Target({ ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

public @interface RuleGroup {

String ruleflowGroup();

}

Rule标识业务规则属性,如优先级。定义如下:

@Target({ ElementType.TYPE })

@Retention(RetentionPolicy.RUNTIME)

public @interface Rule {

String salience() default "10000";

}

RuleFunction标识业务规则中调用的函数方法。定义如下:@Target({ ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

public @interface RuleFunction {

}

基于这三种注解,使用Java语言编写的业务逻辑示例如下:@RuleGroup(ruleflowGroup="RequestRules")

public class RequestRules {

@Rule(salience = "10000")

public static class Rule1 {

public boolean when() { return true;

}

public void then() {

func1();

}

}

@RuleFunction

static void func1() {

}

}

从以上示例可以看到,技术人员使用Java语言实现业务逻辑,能够进行语法检查和语法辅助,也能通过代码质量管理工具保证代码的规范性。

2.3 执行模块

执行模块采用反射技术加载Java语言编写的业务逻辑并执行,处理流程如图2所示。

图2 执行模块处理流程图

具体处理流程如下:

(1)按规则流节点顺序加载使用RuleGroup注解的类;

(2)获取类中使用Rule注解的内部类并按salience排序;(3)按顺序执行各内部类;

①实例化内部类innerRule;

②如果innerRule.when()结果为true则执行inner Rule.then(),否则回到①实例化下一个内部类。

业务规则when部分的输入为字符串,输出为true或false,类似于Javascript中的eval()函数。执行模块采用规则引擎加载此字符串并执行,核心代码如下:

// 加载DRL并执行

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory. newKnowledgeBuilder();

kbuilder add(ResourceFactory newReaderResource(strReade r),ResourceType.DRL);

KnowledgeBase kbase = kbuilder.newKnowledgeBase();

StatefulKnowledgeSession ksession = kbase. newStatefulKnowledgeSession();

ksession insert(messageWrapper);

QueryResults results = ksession.getQueryResults(drlHash);

// 对执行结果进行判断

return (results.size() > 0);

2.4 转换模块

转换模块将Java文件转换为Drools规则引擎支持的DRL文件,处理流程如图3所示。

图3 转换模块处理流程图

具体处理流程如下:

(1)按规则流节点顺序加载Java文件;

(2)使用开源的google JavaParser库进行Java文件解析;

(3)对使用Rule注解的内部类进行循环处理,获取ruleflow-group属性、salience属性、when部分、then部分及function部分;

(4)将生成的符合Drools业务规则语法的字符串写入DRL文件。

3 开发框架应用

从全球民航发展情况看,由于市场竞争不断加剧,全球民航业长期处于微利运营水平。在日益艰难的市场环境中,国内外航空公司在客运方面力图冲破只能提供航空运输的传统服务模式,不断探索新的商务模式和盈利渠道,正在发展成为以航空运输为中心、集酒店、租车、旅游、免税品销售等服务于一体的航空旅游综合服务提供商[4]。航空公司机票+酒店动态打包销售平台项目(简称动态打包项目)正是在这个大背景下立项并实施的。

在开发动态打包项目时,采用了Drools规则引擎,基于规则流(RuleFlow)技术实现动态打包查询、预订、取消等功能,输入输出遵循OTA(Open Travel Alliance)国际标准。

在实现中,将输入输出抽象为MessageWrapper,将每个功能的业务处理流程进行总结,抽象为RequestRules、SwitchingRules、AggregationRules、ResponseOptionRules、ResponseRules共5个节点,分别实现请求校验、外部系统调用、外部系统结果合并、响应结果过滤与排序、响应结果处理(如促销价格计算)功能。节点名称与RuleGroup中的ruleflowGroup属性相对应。每个节点内的业务规则按优先级顺序执行,整体业务处理流程如图4所示。

图4 业务处理流程图

为验证开发框架在提高开发效率方面的效果,项目组选取动态打包查询模块进行比对实验。选取两个水平接近的开发人员,以通过预先设定的单元测试为完成标准,采用直接编写DRL文件的开发方式共花费15人天,采用开发框架共花费11人天。

根据以上比对实验,通过使用Drools业务规则开发框架,动态打包项目提高开发效率20%以上,节省至少5人月开发工作量。同时在SonarQube中代码质量评级为A,取得预期效果。

4 结论

利用基于Java注解的Drools业务规则开发框架,技术人员可以方便的进行业务规则编写、调试,提升代码质量,提高开发效率。

动态打包项目中每个节点内的业务规则按优先级顺序执行,没有涉及规则的重复触发与冲突检测,后续还需要持续改进完善。

[1]张渊,夏清国.基于Rete算法的JAVA规则引擎[J].科学技术与工程,2006,6(11) :1548-1550.

[2]李春芳,谭庆平. 面向业务的 Drools规则引擎改进[J]. 计算机应用与软件,2015,32(5) :20-23.

[3]凌晨,陈芳莉.Java注释类型和APT [J]. 计算机系统应用,2006,15(9):78-82.

[4]王欣明,吕明站.民航附加服务动态打包技术研究[J]. 民航科技,2011(3):39-42.

[5]缴明洋,谭庆平. Java规则引擎技术研究[J]. 计算机与信息技术,2006(3) :44-46.

周中雨(1978——),男,河北省河间市,中级工程师,硕士研究生,主要从事J2EE平台软件架构设计及研发。

李洋(1977——),男,陕西省蓝田县,中级工程师,硕士研究生,主要从事J2EE平台软件架构设计及研发。

王怀超(1984——),男,天津,讲师,博士研究生,主要研究方向航空物流、计算机视觉。

杨程屹(1986——),男,河北省滦县,中级工程师,博士研究生,主要从事数据挖掘、算法研究等工作。

周中雨1,李洋1,杨程屹1,王怀超2
(1.中国民航信息网络股份有限公司,北京,100105;2.中国民航大学计算机科学与技术学院,天津,300300)

本文设计并实现了基于Java注解的规则引擎Drools业务规则开发框架。该开发框架针对Drools业务规则存在的无法语法检查、无法调试等问题,基于Java注解技术,直接使用Java语言实现业务逻辑,单元测试通过后生成Drools业务规则,从而提升代码质量并提高开发效率。

规则引擎;Drools;业务规则;Java注解;Java反射

Design and Implementation on Framework for Developing Drools Business Rules Based on Java Annotation

Zhou Zhongyu1,Li Yang1,Yang Chengyi1,Wang Huaichao2
(1.Travelsky Technology Limited,Beijing,100105;2.College of Computer Science and Technology, Civil Aviation University of China,Tianjin,300300)

We design and implement a framework for developing Drools business rules based on Java annotation in order to solve the problems such as absence of syntax checking, difficulty of debugging, etc. Using the framework developers implement business logic in Java language and translate Java files to Drools business rules after passing the unit test The framework is designed to improve code quality and efficiency

Rule Engine;Drools;Business Rules;Java Annotation;Java Reflect

2013年民航科技创新引导项目(MHRD20130216)。

猜你喜欢

引擎代码逻辑
刑事印证证明准确达成的逻辑反思
逻辑
创新的逻辑
创世代码
创世代码
创世代码
创世代码
女人买买买的神逻辑
蓝谷: “涉蓝”新引擎
无形的引擎