基于Drools决策表的通用规则集设计

来源:互联网 发布:聚划算淘宝商城手表 编辑:程序博客网 时间:2024/06/06 02:47

Jie 2017/12/05

1 决策表设计

RuleSet [required]规则包自定义名称

Import [option]导入规则库的类和静态函数(function)列表

Sequential [option]是否按从上到下的顺序执行规则


RuleTable [required]定义规则表,后紧接自定义规则前缀名称

CONDITION [required]该列是规则的条件表达式

ACTION [required]该列是规则的结论

PRIORITY [option]该列是规则的salience值,数值越大优先级越高。覆盖Sequential关键字


$param占位符

$1,$2,...占位符:逗号分隔的值列表


通过Import类和静态方法,在决策表内就可以使用自定义方法扩展操作。

DTO的paramX属性均为String类型,需要根据具体上下文调用parse方法转换数据类型。

规则执行结果可保存在DTO的retX属性(String类型),也需要parse。

1.1 需求模板+数据


2 Drools决策表通用服务

支持XLS文件、DRL字符串格式的规则集。
建议通过读取DRL字符串配置的方式加载规则集并执行。
/** Drools决策表 */public class DroolsSvs {/** * 加载XLS文件,获取KieSession *  * @param xlsPath *            决策表XLS文件路径 * @return KieSession */public static KieSession getKieSessionByXls(String xlsPath) {DecisionTableConfiguration dtc = KnowledgeBuilderFactory.newDecisionTableConfiguration();dtc.setInputType(DecisionTableInputType.XLS);KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();knowledgeBuilder.add(ResourceFactory.newClassPathResource(xlsPath, DroolsSvs.class), ResourceType.DTABLE, dtc);KnowledgeBase knowledgeBase = knowledgeBuilder.newKnowledgeBase();knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());return knowledgeBase.newStatefulKnowledgeSession();}/** * 加载DRL字符串,获取KieSession *  * @param drlStr *            DRL字符串 * @return */public static KieSession getKieSessionByDrlString(String drlStr) {Resource resource = ResourceFactory.newReaderResource((Reader) new StringReader(drlStr));KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();knowledgeBuilder.add(resource, ResourceType.DRL);KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());return knowledgeBase.newStatefulKnowledgeSession();}/** * 将XLS文件编译为DRL字符串 *  * @param xlsPath *            决策表XLS文件路径 * @return DRL字符串 * @throws Exception */public static String compile2DRL(String xlsPath) throws Exception {FileInputStream fis = new FileInputStream(new File(xlsPath));SpreadsheetCompiler converter = new SpreadsheetCompiler();return converter.compile(fis, InputType.XLS);}/** * 注入POJO,执行规则 *  * @param kieSession * @param pojos */public static void execute(KieSession kieSession, DroolsSpreadsheet... pojos) {for (DroolsSpreadsheet pojo : pojos)kieSession.insert(pojo);kieSession.fireAllRules();kieSession.dispose();}public static void main(String[] args) {try {String xlsPath = "Drools.xls";String drlStr = DroolsSvs.compile2DRL(xlsPath);// KieSession kieSession = DroolsSvs.getKieSessionByXls(xlsPath);KieSession kieSession = DroolsSvs.getKieSessionByDrlString(drlStr);DroolsSpreadsheet pojo1 = new DroolsSpreadsheet();pojo1.setParam1("Orthopedics");pojo1.setParam2("31");pojo1.setParam3("1000");pojo1.setParam4("B");DroolsSpreadsheet pojo2 = new DroolsSpreadsheet();pojo2.setParam1("Orthopedics");pojo2.setParam2("31");pojo2.setParam3("1800");pojo2.setParam4("B");DroolsSvs.execute(kieSession, pojo1, pojo2);} catch (Exception e) {e.printStackTrace();}}}

2.1 通用DTO

public class DroolsSpreadsheet {private String param1;private String param2;private String param3;private String param4;private String param5;private String param6;private String param7;private String param8;private String ret1;private String ret2;private String ret3;// gets and sets}

2.2 maven依赖

<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${drools.version}</version></dependency>

原创粉丝点击