您的位置:首页 > 其它

用规则引擎来实现复杂业务逻辑判断之drools

2015-08-26 12:48 323 查看
前一阵项目中用到了规则引擎,感觉处理一些复杂逻辑很方便,所以拿来分享一下。

业务背景:需要根据不同的法条,判断当事人是否复核减刑、假释条件,在界面上给予提示。

实现分析:因为法院比较多,且涉及计算种类比较多,如果每个法条都写相应的实现,一是不好扩展,需要新增的时候必须新增实现,二是如果存在修改,还需要动原来的实现。

因此,我们考虑使用规则引擎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的基本功能就介绍完了,对需要实现类似功能的时候,可以尝试使用这个规则引擎来实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: