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

前一阵项目中用到了规则引擎,感觉处理一些复杂逻辑很方便,所以拿来分享一下。

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

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

因此,我们考虑使用规则引擎drools来实现本次需求,以下我们项目中使用的jar版本。


    org.drools
    drools-core
    5.0.1


    org.drools
    drools-compiler
    5.0.1


项目中引入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 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)