前一阵项目中用到了规则引擎,感觉处理一些复杂逻辑很方便,所以拿来分享一下。
业务背景:需要根据不同的法条,判断当事人是否复核减刑、假释条件,在界面上给予提示。
实现分析:因为法院比较多,且涉及计算种类比较多,如果每个法条都写相应的实现,一是不好扩展,需要新增的时候必须新增实现,二是如果存在修改,还需要动原来的实现。
因此,我们考虑使用规则引擎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的基本功能就介绍完了,对需要实现类似功能的时候,可以尝试使用这个规则引擎来实现。
本文介绍如何利用Drools规则引擎简化复杂逻辑处理。通过案例演示了如何配置drl文件及在Java中调用,展示了规则引擎的优势。
4917

被折叠的 条评论
为什么被折叠?



