使用规矩引擎

来源:互联网 发布:世纪矩阵交易员 编辑:程序博客网 时间:2024/06/11 09:22

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
  1. StatefulKnowledgeSession (有状态)
StatefulKnowledgeSession statefulSession = kbase.newStatefulKnowledgeSession();
statefulSession.insert("宋杰修");//输入规则运行参数
statefulSession.insert("Sjx");
statefulSession.fireAllRules();
statefulSession.dispose();
     2. StatelessKnowledgeSession (无状态)
StatelessKnowledgeSession statelessSession = kbase.newStatelessKnowledgeSession();
//输入规则运行参数,封装在list
List 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不能

参考: http://benbenxiongyuan.iteye.com/blog/1121479

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变量

 

原创粉丝点击