http://liureying.blog.163.com/blog/static/615135201111172188559/
介绍:在代码中使用Drools规则引擎来进行规则运算。
思路:1)初始规则引擎环境 。 2)输入进行规则运行参数和获取返回运算结果
1)初始规则引擎环境
//KnowledgeBuilder的作用就是用来在业务代码当中收集已经编写好的规则
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
//ResourceFactory 的对象加载规则文件,通过该对象可以实现从 Classpath、URL、File、ByteArray、Reader 或诸如 XLS
的二进制文件加载 。
kbuilder.add(ResourceFactory.newClassPathResource("com/demo/fun/rulefunction.drl"),ResourceType.DRL);
// 产生规则包的集合
Collection<KnowledgePackage> kpackage = kbuilder.getKnowledgePackages();
//knowledgeBuilder的hasErrors()方法来检测已添加进去的规则当中有没有错误
/
/KnowledgeBase 是 Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象
KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
//规则包的集合添加到KnowledgeBase
kbase.addKnowledgePackages(kpackage);
2)输入进行规则运行参数和获取返回运算结果
提供了两个对象与规则引擎进行交互:StatefulKnowledgeSession和StatelessKnowledgeSession
- StatefulKnowledgeSession (有状态)
StatefulKnowledgeSession statefulSession = kbase.newStatefulKnowledgeSession();statefulSession.insert("宋杰修");//输入规则运行参数statefulSession.insert("Sjx");statefulSession.fireAllRules();statefulSession.dispose();
2.
StatelessKnowledgeSession (无状态)
StatelessKnowledgeSession statelessSession = kbase.newStatelessKnowledgeSession();//输入规则运行参数,封装在listList list = new ArrayList();list.add("宋杰修");list.add("Sjx");statelessSession.execute(list);
note:1.输入参数必须要跟规则文件内的规则变量一样类型。2.规则文件有多个规则有相同类型参数。 参数 输入所有 相同类型规则,作为这些规则的参数3.输入多个相同类型参数,规则引擎对每个参数都执行一遍规则运算
StatefulKnowledgeSession与StatelessKnowledgeSession区别:
StatefulKnowledgeSession要fireAllRules()方法触发所有的规则执行,最后还需要调用 dispose()法以释放相关内存资源。StatelessKnowledgeSession在execute(参数时)自动触发所有的规则执行和释放相关内存资源
StatefulKnowledgeSession用insert方法接受业务数据,StatelessKnowledgeSession用execute方法接受业务数据,一次传多个参数只能封装到List.接受该list
StatefulKnowledgeSession它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。除了insert()方法接受参数,还可以update(),和retract()对业务数据处理而StatelessKnowledgeSession不能
Drools查询WorkingMemory 当中查找 Fact 的方法实现
QueryResults queryResults = statefulSession.getQueryResults(" testQuery", new Object[] { new Integer(30) });for (QueryResultsRow qr : queryResults) {
Applicant app = (Applicant) qr.get("app");// 打印查询结果System.out.println("customer name :" + app.getName());
}
note:
规则文件 Query部分必须有 testQuery查询
Drools记录规则当中产生的数据及状态的变化数据,通过在 StatefulKnowledgeSession 当中设置 global 对象来实现
statefulSession.insert(new Integer("5"));statefulSession.setGlobal("myGlobalList", new ArrayList());statefulSession.setGlobal("app", new Applicant("kk", 10));statefulSession.fireAllRules();List list = (List) statefulSession.getGlobal("myGlobalList");Applicant app = (Applicant) statefulSession.getGlobal("app");System.out.println(list.size());System.out.println(app.getAge());statefulSession.dispose();
note:规则文件 Global 部分必须有 myGlobalList 和 myGlobalList变量