用规则引擎来实现复杂业务逻辑判断之drools
2015-08-26 12:48
323 查看
前一阵项目中用到了规则引擎,感觉处理一些复杂逻辑很方便,所以拿来分享一下。
业务背景:需要根据不同的法条,判断当事人是否复核减刑、假释条件,在界面上给予提示。
实现分析:因为法院比较多,且涉及计算种类比较多,如果每个法条都写相应的实现,一是不好扩展,需要新增的时候必须新增实现,二是如果存在修改,还需要动原来的实现。
因此,我们考虑使用规则引擎drools来实现本次需求,以下我们项目中使用的jar版本。
项目中引入org.drools的相关jar包,即可开始编写,相关的实现,这里主要是配置一个drl文件,示例如下。
然后在java里边可以做如下调用
drl中的条件计算方式有很多,例如 && 、|| 、==、!= 等,用到的时候可以上网查询下相关资料。
另外,drl规则一多,很容易配置错误了,这里我们可以在java代码加载drl的时候对其进行监控,用下边的代码可以实现
现在,drools的基本功能就介绍完了,对需要实现类似功能的时候,可以尝试使用这个规则引擎来实现。
业务背景:需要根据不同的法条,判断当事人是否复核减刑、假释条件,在界面上给予提示。
实现分析:因为法院比较多,且涉及计算种类比较多,如果每个法条都写相应的实现,一是不好扩展,需要新增的时候必须新增实现,二是如果存在修改,还需要动原来的实现。
因此,我们考虑使用规则引擎drools来实现本次需求,以下我们项目中使用的jar版本。
<dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>5.0.1</version> </dependency>
项目中引入org.drools的相关jar包,即可开始编写,相关的实现,这里主要是配置一个drl文件,示例如下。
package conf.xfbg.drl import com.thunisoft.test.Test; rule "rule1" when $test:Test(a==1 && b==2); then $test.setC(3); end rule "rule2" when $test:Test(a==2 && b==2); then $test.setC(4); end可以看到,它与java代码很相似,都可以使用package、import等关键字,从上述代码中不难看懂,它表达的意思是,规则1,当Test对象的属性a=1且b=2的时候,往属性c中设置3;规则2,当Test对象的属性a=2且b=2的时候,往属性c中设置4。其中when是条件,then是满足条件以后要做的事情。
然后在java里边可以做如下调用
package com.thunisoft.test; import java.io.File; import java.net.URLDecoder; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.runtime.StatelessKnowledgeSession; public class DRoolsTest { public static void main(String[] args) throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); String filePath = DRoolsTest.class.getClassLoader() .getResource("conf/test.drl").getPath(); File file = new File(URLDecoder.decode(filePath, "utf-8")); kbuilder.add(ResourceFactory.newFileResource(file), ResourceType.DRL); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatelessKnowledgeSession ksession = kbase .newStatelessKnowledgeSession(); Test test = new Test(); test.setA(1); test.setB(2); ksession.execute(test); System.out.println(test.getC()); } }即可看到控制台中输入了 3,这样整个规则就算配置完毕了,当然这只是个例子,具体使用的时候还是有很多种方法的。
drl中的条件计算方式有很多,例如 && 、|| 、==、!= 等,用到的时候可以上网查询下相关资料。
另外,drl规则一多,很容易配置错误了,这里我们可以在java代码加载drl的时候对其进行监控,用下边的代码可以实现
if (kbuilder.hasErrors()) { Iterator<KnowledgeBuilderError> it = kbuilder.getErrors() .iterator(); while (it.hasNext()) { KnowledgeBuilderError error = it.next(); int[] lines = error.getErrorLines(); StringBuilder errorMsg = new StringBuilder(); for (int i = 0, length = lines.length; i < length; i++) { errorMsg.append("第").append(lines[i]); if (i < length - 1) { errorMsg.append("、"); } } errorMsg.append("行,规则引擎初始化有误:"); log.error(errorMsg.toString()); log.error(error.getMessage()); } }这样在首次加载规则引擎的时候,就可以清楚地知道drl文件配置的是不是正确了。
现在,drools的基本功能就介绍完了,对需要实现类似功能的时候,可以尝试使用这个规则引擎来实现。
相关文章推荐
- 测试笔记总结
- Android高级编程笔记(四)深入探讨Activity(转)
- php5中的对象比较
- 《深入应用C++11:代码优化与工程级应用》勘误表
- 互联网金融P2P主业务场景自动化测试
- eclipse字体颜色
- HTTP 请求报文 响应报文(转)
- git使用
- Python属性、方法和类管理系列之----元类
- js中的eval()和catch()
- Hash表
- JavaScript Array reverse 方法:颠倒数组中元素的顺序
- ndk开发的一些小笔记http://120.26.81.9/bin/flash.bin
- Windows系统安装时间
- C语言关于socket编程解释比较清楚的一个博文
- javafx登录demo透明效果
- Hibernate 4.3 开发问题详解
- Java---页面之间传值跳转
- Linux 系统中重启数据库
- Ted has a new house