目录
需求
工作中需要开发一个规则服务,提供各种规则,每条规则由不同的校验条件以及返回值构成。配置好的规则可以提供给其他服务使用,做各种业务校验。
实现
基于drools规则引擎实现
根据不同的规则,可以动态地生成不同的drl
客户端传参,提供相应的条件值
得到drl和输入参数后,便可以用 drools 来校验规则是否通过,以及通过后相应的业务处理了
代码
pom
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.37.0.Final</version>
</dependency>
使用示例
public class DynamicRule {
public static void main(String[] args) {
//业务代码处理后得到的drl
String drl =
"import java.util.Map;\n" +
"import java.util.HashMap;\n" +
"import java.util.List;\n" +
"import java.util.ArrayList;\n" +
"global java.util.HashMap returnObj\n" +
"rule \"test\"\n" +
"when\n" +
" $m : Map()\n" +
" $o : Object($m[\"name\"].equals(\"abc\") && $m[\"age\"] >= 18)\n" +
"then\n" +
" System.out.println($m);\n" +
" returnObj.put(\"result\", true);\n" +
"end";
KieSession kieSession = getKieSession(drl);
Map<String, Object> returnObj = new HashMap<>();
kieSession.setGlobal("returnObj", returnObj);
//校验的条件值
Map<String, Object> data = new HashMap<>();
data.put("name", "abc");
data.put("age", 17);
kieSession.insert(data);
kieSession.fireAllRules();
kieSession.dispose();
if (Boolean.TRUE.equals(returnObj.get("result"))) {
System.out.println("success");
} else {
System.out.println("fail");
}
}
public static KieSession getKieSession(String drl) {
KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL);
return kieHelper.build().newKieSession();
}
}