drools的懒加载和执行
来源:互联网 发布:js value 赋值 编辑:程序博客网 时间:2024/06/06 12:42
drools网上资料很多,这里针对自己的接触了解和实际应用进行如下总结,
- 工程引入。
工程pom.xml,至少需加入<dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>6.5.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>6.5.0.Final</version></dependency>
从官网下包,例如:drools-distribution-6.5.0.Final,从binaries目录,大致需手工引入第三方包:
ant-1.8.3.jar
core-3.1.1.jar
ecj-4.4.2.jar
……
忘了还有哪些,这些是运行时用到,所以在实际使用时,可以依据报错信息(java.lang.ClassNotFoundException),反推还需要哪些jar,反正所需要的都在binaries目录里。 - 简单封装。
package com.pomelo.drools.util;import java.util.ArrayList;import java.util.List;import org.kie.api.KieServices;import org.kie.api.builder.KieBuilder;import org.kie.api.builder.KieFileSystem;import org.kie.api.builder.KieRepository;import org.kie.api.builder.Message;import org.kie.api.runtime.KieContainer;import org.kie.api.runtime.KieSession;import org.kie.api.runtime.rule.AgendaFilter;import org.kie.api.runtime.rule.Match;import com.pomelo.drools.model.RuleCfg;/** * @author zxz * */public class MyDrools {/** * 对GKS、GKR、GKFS这三个的概念模棱两可,大概一个应用构建一套就OK了。 */private static final KieServices GKS = KieServices.Factory.get();private static final KieRepository GKR = GKS.getRepository();private static final KieFileSystem GKFS = GKS.newKieFileSystem();/** * 用于本地应用标记哪个规则文件已加载。 */private static List<string> gKfsFacade = new ArrayList<string>();/** * 用于存放已加载规则的容器,每次加载规则需重新生成。 */private static KieContainer kc;/** * 规则配置,一般存在数据库中,这里用静态语句块初始化。 */private static RuleCfg ruleCfg;static {StringBuffer sb = new StringBuffer("package com.pomelo.drools.drl;\n");sb.append("import com.pomelo.drools.model.Users\n");sb.append("rule \"userStatusChangeRule\"\n");sb.append("when\n");sb.append("users:Users(status == 0)\n");sb.append("then\n");sb.append("users.status = 1;\n");sb.append("System.out.println(\"done\");\n");sb.append("end;\n");ruleCfg = new RuleCfg();ruleCfg.setRuleId(2000001);ruleCfg.setClassify("user_status_change");ruleCfg.setRuleName("userStatusChangeRule");ruleCfg.setRule(sb.toString());ruleCfg.setStatus(0);}/** * ruleId:规则编码,例如:2000001。 * params:规则判断所需要的参数。 */public static void invokeIns(final int ruleId, Object... params) {/** * loadCfg:根据规则编码查询规则对象,实际应用是查询数据库,这里简化不做说明。 */RuleCfg ruleCfg = loadCfg(ruleId);/** * 生成规则文件存放路径,这里可以大致推测drool部分核心内容,是把规则写在drl文件,drools内部自己构建一个文件系统。 */String drlPath = genDrlPath(ruleCfg);if(ruleCfg.getStatus() == RuleCfg.STATUS_INIT)gKfsFacade.remove(drlPath);if(!gKfsFacade.contains(drlPath)) {synchronized(gKfsFacade) {if(!gKfsFacade.contains(drlPath)) {GKFS.write(drlPath, ruleCfg.getRule());KieBuilder kb = GKS.newKieBuilder(GKFS);/** * 类似java工程,对文件系统进行编译。 */kb.buildAll();if(kb.getResults().hasMessages(Message.Level.ERROR)) {System.out.println(kb.getResults().toString());/** * 若编译失败,则把当前规则从文件系统中删除掉,重新编译。 */GKFS.delete(ruleCfg.getClassify());kb = GKS.newKieBuilder(GKFS);kb.buildAll();kc = GKS.newKieContainer(GKR.getDefaultReleaseId());throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());}kc = GKS.newKieContainer(GKR.getDefaultReleaseId());ruleCfg.setStatus(RuleCfg.STATUS_LOADED);gKfsFacade.add(drlPath);}}}fireTheRule(ruleCfg.getRuleName(), params);}private static RuleCfg loadCfg(final int ruleId) {return ruleCfg;}private static String genDrlPath(RuleCfg ruleCfg) {return "src/main/resources/drl/" + ruleCfg.getClassify() + "/" + ruleCfg.getRuleName() + ".drl";}private static void fireTheRule(String ruleName, Object... params) {KieSession ks = kc.newKieSession();try {for(int i = 0;i < params.length;i++) {ks.insert(params[i]);}ks.fireAllRules(ruleNameEqualsAgendaFilter(ruleName));} finally {ks.dispose();}}private static AgendaFilter ruleNameEqualsAgendaFilter(final String ruleName) {return new AgendaFilter() {public boolean accept(Match paramMatch) {return paramMatch.getRule().getName().equals(ruleName);}};}}完整工程,详见https://github.com/Monicazxz/MyDrools
阅读全文
0 0
- drools的懒加载和执行
- drools和spring的集成
- drools和spring的集成
- javascript的加载和执行浅析
- main()方法的执行 和 类加载
- JavaScript的性能优化:加载和执行
- JavaScript的性能优化:加载和执行
- JavaScript的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- JavaScript的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行 .
- JavaScript 的性能优化:加载和执行
- JavaScript 的性能优化:加载和执行
- 【学习摘记】马士兵bbs改良版_课时10_dreamweaver修图
- C# BackupSupport v1.2 (文本复制工具)
- SimpAdapter适配器
- cocos2dx之寻路 A星
- Oracle 错误总结及问题解决 ORA
- drools的懒加载和执行
- hiveserver2和zookeeper的HA搭建
- 接口
- Electron相关
- sql语句优化的几个要点
- keepalived+nginx+tomcat7+redis搭建高可用集群(一)
- MySQL备份与还原导入
- mysql执行引擎
- Android 语音声波控件 条形波控件