本文讲述通过freemarker动态生成drools文件来实现规则引擎的使用。以下是项目中的实例练习(仅供参考),大家可以使用一些简单的业务逻辑。
1.引入依赖
<!--规则引擎drools-->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>7.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>7.0.0.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2.在resource下创建freemarker文件(drools和freemarker的语法可自行学习),rules文件夹名称不是固定的,只要你在读取时写一样的就好,如图:
3. 通过代码动态填充freemarker中的参数,并获取到文件内容。
private static String getTemplateContext(){
String path = "/rules/";
String filename = "test.ftl";
Map<String,Object> data = new HashMap<>();
data.put("num","1");
data.put("isHand","2");
FireAlertDrlReq fireAlertDrlReq = new FireAlertDrlReq();
fireAlertDrlReq.setId(1);
fireAlertDrlReq.setSomeMinute(1);
fireAlertDrlReq.setHandAlert(1);
fireAlertDrlReq.setSomeAlert(1);
fireAlertDrlReq.setAlertTime(System.currentTimeMillis()-1*60*1000);
fireAlertDrlReq.setNowTime(System.currentTimeMillis());
fireAlertDrlReq.setAlertLevel("提醒");
FireAlertDrlReq fireAlertDrlReq2 = new FireAlertDrlReq();
fireAlertDrlReq2.setId(2);
fireAlertDrlReq2.setSomeMinute(3);
fireAlertDrlReq2.setHandAlert(1);
fireAlertDrlReq2.setSomeAlert(3);
fireAlertDrlReq2.setAlertTime(System.currentTimeMillis()-1*60*1000);
fireAlertDrlReq2.setNowTime(System.currentTimeMillis());
fireAlertDrlReq2.setAlertLevel("一般");
List<FireAlertDrlReq> list = new ArrayList<>();
list.add(fireAlertDrlReq);
list.add(fireAlertDrlReq2);
data.put("list", list);
String template = null;
try {
template = FreeMarkerUtil.parseTemplate(path, filename, data);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(template);
return template;
}
4.通过freemarker生成drools文件后,进行加载。
private static void stringRule(String myRule){
KieHelper helper = new KieHelper();
helper.addContent(myRule, ResourceType.DRL);
KieSession kieSession = helper.build().newKieSession();
FireAlertDrlReq fireAlertDrlReq = new FireAlertDrlReq();
FireAlertDrlResp fireAlertDrlResp = new FireAlertDrlResp();
DroolService droolService = new DroolService();
fireAlertDrlReq.setHandAlert(1);
fireAlertDrlReq.setSomeAlert(1);
fireAlertDrlReq.setAlertTime(System.currentTimeMillis()-1*60*1000);
fireAlertDrlReq.setNowTime(System.currentTimeMillis());
//参数填充drools文件中
kieSession.insert(fireAlertDrlReq);
kieSession.insert(fireAlertDrlResp);
kieSession.insert(droolService);
//启用drools规则引擎
kieSession.fireAllRules();
//调用完成关闭
kieSession.dispose();
}
5.测试
public static void main(String[] args) {
String myRule = getTemplateContext();
stringRule(myRule);
}