需求
工作中需要开发一个规则服务,提供各种规则,每条规则由不同的校验条件以及返回值构成。配置好的规则可以提供给其他服务使用,做各种业务校验。
实现
基于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(); } }