决策表(decision-table)即以xls表格的形式定义规则,而不再是只有开发人员能看懂的drl文本。
对业务人员来说,这种EXCEL表格肯定是友好的;对开发人员而言,需要使用官方API将xls内容“翻译”为熟悉的drl串,即编译器SpreadsheetCompiler
。
<drools.version>7.42.0.Final</drools.version>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
</dependency>
@Data
@Accessors(chain = true)
public class PersonInfoEntity {
private String sex;
private int age;
private double salary;
}
/**
* 直接从类路径找到目标xls文件,翻译,加载,触发
*/
@Test
public void test() {
String classPath = "testRule.xls";
SpreadsheetCompiler compiler = new SpreadsheetCompiler();
//文件读取与编译
InputStream is = this.getClass().getClassLoader().getResourceAsStream(classPath);
String drl = compiler.compile(is, InputType.XLS);
log.info("解析出的drl文本:\n{}", drl);
//载入规则
KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL);
//定义fact
PersonInfoEntity personInfoEntity = new PersonInfoEntity();
personInfoEntity.setSex("女").setAge(35).setSalary(1000);
//创建会话,fact插入工作内存,触发
KieSession session = kieHelper.build().newKieSession();
List<String> list = new ArrayList<String>();
session.setGlobal("listRules", list);
session.insert(personInfoEntity);
session.getAgenda().getAgendaGroup("sign").setFocus();
session.fireAllRules();
for (String s : list) {
log.info("输出结果:{}", s);
}
//关闭会话
session.dispose();
}
/**
* 直接从类路径找到目标xls文件,翻译,加载,触发
*/
@Test
public void test() {
String classPath = "testRule.xls";
String fsp = "D:/temp/testRule.xls";
//文件读取与编译
//String drl = readXlsDrl("cp", classPath);
String drl = readXlsDrl("fs", fsp);
//载入规则
KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL);
...
}
private String readXlsDrl(String type, String path) {
InputStream is = null;
if("cp".equals(type)) {
is = this.getClass().getClassLoader().getResourceAsStream(path);
}else if("fs".equals(type)) {
try {
is = new FileInputStream(new File(path));
} catch (FileNotFoundException e) {
log.error("文件读取异常", e);
throw new RuntimeException("文件读取异常", e);
}
}
SpreadsheetCompiler compiler = new SpreadsheetCompiler();
String drl = compiler.compile(is, InputType.XLS);
log.info("解析出的drl文本:\n{}", drl);
return drl;
}
@Test
public void test() {
String classPath = "testRule.xls";
String fsp = "D:/temp/testRule.xls";
//文件读取与编译
// String drl = readXlsDrl("cp", classPath);
String drl = readXlsDrl("fs", fsp);
//载入规则
KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL);
//drl文本语法校验
verifyDrl(kieHelper);
...
}
private void verifyDrl(KieHelper kieHelper) {
Results verify = kieHelper.verify();
if (verify.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) {
List<Message> messages = verify.getMessages(Message.Level.WARNING, Message.Level.ERROR);
for (Message message : messages) {
log.error("Error: " + message.getText());
}
throw new IllegalStateException("Compilation errors were found. Check the logs.");
}
}
原文:https://www.cnblogs.com/noodlerkun/p/13642989.html