`
wangmengbk
  • 浏览: 288466 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Drools 规则流的使用介绍

 
阅读更多
由于工作中长时间使用drools进行开发规则引擎,没有及时的将该规则引擎进行分享出来,以下是drools流的介绍:
Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。

Drools Flow为Drools平台提供了工作流或者(业务)流程能力。一个业务流程或者工作流使用一个流程图表描述了一系列需要执行的步骤的顺序。这使得它更容 易来描述一个各种不同任务的复杂组合。流程在描述基于状态的,长时间运行的过程时特别有用。Drools Flow允许最终用户使用这些流程来指定,执行和监控(一部分)他们的业务逻辑。Drools Flow流程框架可以很容易地嵌入到任何的Java应用中(作为一个简单的Java组件)或者能够以一个服务器环境的模式独立运行。
Drools 流是一个工作流或流程的引擎,允许流程和规则的高级集成。流程或工作流使用流程图描述了需要执行的一系列步骤的顺序。如下图所示: 执行 tested 或 test 后在执行 test2,rule 完成结束。



第一步:首先创建一个drools project 项目工作;

第二步:创建一个 *.drl 文件,和一个 *.rf 文件;对于drl 文件时存放规则库的,rf文件定义的规则流的流程;
*.drl 文件内容:

package com.wm

import com.sample.RuleFlow;

#list any import classes here.



#declare any global variables here
#说明:如果在规则流中使用组建Gateway为split ,
#在规则中更新workingmemory中不会被其他规则使用更新后的值



rule "First"
lock-on-active true
ruleflow-group 'tested'
    when
        $rf:RuleFlow(userName=="wangm");
       # eval($rf.getUserName()=="wangm");
    then
        $rf.setAge(10);
        $rf.setUserName("wangmm");
        update($rf);
        System.out.println($rf.getUserName());

end

rule "Second"
  no-loop true
#lock-on-active true
    ruleflow-group 'test'
    when
       $rf:RuleFlow(userName=="wangm" && age < 18);
    then
       $rf.setSource(58);
        update($rf);
        System.out.println("未成年");

end

rule "Third"
   no-loop true
  #lock-on-active true
    ruleflow-group 'test'
    when
       $rf:RuleFlow(userName=="wangmm" && age >= 18);
    then
        $rf.setSource(100);
        update($rf);
        System.out.println("已成年");
       
end


rule "Third2"
    no-loop true
    ruleflow-group 'test2'
    when
       $rf:RuleFlow(userName=="wangmm" && source < 60);
    then
        System.out.println($rf.getUserName()+"的年龄为"+$rf.getAge()+" 成绩为"+$rf.getSource()+" 规则 (Third2)");
        $rf.setSource($rf.getSource()+10);
        update($rf);
end


rule "Third3"
no-loop true
   # lock-on-active true
    ruleflow-group 'test2'
    when
       $rf:RuleFlow(userName=="wangmm" && source >= 60);
    then
        System.out.println($rf.getUserName()+"的年龄为"+$rf.getAge()+" 成绩为"+$rf.getSource()+" 规则 (Third3)");
         $rf.setSource($rf.getSource()+1);
        update($rf);
end

rule "Third4"
no-loop true
   # lock-on-active true
    ruleflow-group 'test3'
    when
    $rf:RuleFlow();
       eval(true);
    then
        System.out.println($rf.getUserName()+"的年龄为"+$rf.getAge()+" 成绩为"+$rf.getSource()+" 规则(Third4)");
end

*.rf 文件源码:

<?xml version="1.0" encoding="UTF-8"?>
<process xmlns="http://drools.org/drools-5.0/process"
         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
         type="RuleFlow" name="flow2" id="1" package-name="com.wm" version="" >

  <header>
  </header>

  <nodes>
    <start id="1" name="Start" x="7" y="71" width="48" height="48" />
    <ruleSet id="2" name="tested" x="177" y="16" width="80" height="48" ruleFlowGroup="tested" />
    <end id="7" name="End" x="482" y="96" width="48" height="48" />
    <ruleSet id="9" name="test" x="177" y="96" width="80" height="48" ruleFlowGroup="test" />
    <ruleSet id="10" name="test2" x="328" y="178" width="80" height="48" ruleFlowGroup="test2" />
    <split id="11" name="Gateway" x="88" y="95" width="49" height="49" type="3" >
      <constraints>
        <constraint toNodeId="9" toType="DROOLS_DEFAULT" name="toTest" priority="1" type="rule" dialect="java" >eval(true)</constraint>
        <constraint toNodeId="2" toType="DROOLS_DEFAULT" name="toTested" priority="1" type="rule" dialect="java" >eval(true)</constraint>
      </constraints>
    </split>
    <join id="12" name="dd" x="289" y="96" width="49" height="49" type="1" />
    <ruleSet id="13" name="Rule" x="370" y="96" width="80" height="48" ruleFlowGroup="test3" />
  </nodes>

  <connections>
    <connection from="11" to="2" />
    <connection from="13" to="7" />
    <connection from="11" to="9" />
    <connection from="12" to="10" />
    <connection from="1" to="11" />
    <connection from="2" to="12" />
    <connection from="9" to="12" />
    <connection from="10" to="13" />
  </connections>

</process>

第三步:创建一个测试类:代码如下

package com.sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

/**
*
* Created on 2014-7-30
    规则流测试类
*/
public class RuleFlowTest
{
   
    public static void main(String[] args)
    {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
//      kbuilder.add(ResourceFactory.newClassPathResource("test3.drl"), ResourceType.DRL);
     kbuilder.add(ResourceFactory.newClassPathResource("ruleFlow.drl"), ResourceType.DRL);
    kbuilder.add(ResourceFactory.newClassPathResource("ruleflowed.rf"), ResourceType.DRF);
    // kbuilder.add(ResourceFactory.newClassPathResource("dd.bpmn"), ResourceType.BPMN2);
     KnowledgeBuilderErrors errors = kbuilder.getErrors();
     if (errors.size() > 0) {
         for (KnowledgeBuilderError error: errors) {
             System.err.println(error);
         }
         throw new IllegalArgumentException("Could not parse knowledge.");
     }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
       
        KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "ruleflow");
        RuleFlow rf = new RuleFlow();
        rf.setUserName("wangm");
        rf.setSex("男");
        rf.setAge(18);
        rf.setSource(88);
        ksession.insert(rf);
        ksession.startProcess("1");
        ksession.fireAllRules();
        ksession.dispose();
       
       
       
    }
   
  
}


通过以上也就是一个简单入门的规则流实例,对于源代码可以从附件中下载。


其他可以参考:
http://www.cnblogs.com/skyme/archive/2011/11/14/2245558.html
  • 大小: 39.4 KB
分享到:
评论
1 楼 菜鸟学生会 2018-01-17  
Drools规则工作流引擎开发教程
网盘地址:http://pan.baidu.com/s/1boavEAN 密码:q4e0
备用地址(腾讯微云):http://url.cn/5NZUh5b 密码:rhO85Y

相关推荐

    jboss drools5.5 规则流完整代码

    jboss drools5.5 案例 规则流完整代码

    Drools规则流

    针对Drools6版本规则流部分的整理,翻译,希望能给大家些微末帮助。

    drools5.1 规则流示例

    使用Drools5.1 规则引擎做的一个关于规则流的小示例,含规则流的rf 和 Xml 格式文件,以及一个自动生成顺序规则流的方法。 在 eclipse indigo 上运行通过。

    Drools规则引擎开发实例+源码

    Drools 规则引擎是现在流行的开源免费规则引擎 功能强大,使用方便 本案例 直接带你入门到运用

    Drools规则引擎用户手册

    6.8.4. 在你的应用程序中使用规则流 153 6.9. XML规则语言 153 6.9.1. 何时使用XML 153 6.9.2. XML 格式 154 6.9.3. 遗留的Drools 2.x XML 规则格式 159 6.9.4. Automatic transforming between formats (XML and ...

    规则引擎Drools 之 springboot 集成、热加载

     如果对drools还不是特别熟悉的,可以看下 《规则引擎Drools 之 初识drools》这篇文章;  本文源码,github 传送门:https://github.com/vincent9309/drools:  系统架构如下: 二、项目目录结构 三、...

    基于Drools规则引擎的实例

    在网上看了基于Drools的规则流的应用,但是在处理.RF文件时遇到了空指针问题,因此没有用规则流的方法,解决了相同的规则匹配。

    Drools4.0官方使用手册中文

    6.8.4. 在你的应用程序中使用规则流 161 6.9. XML规则语言 162 6.9.1. 何时使用XML 162 6.9.2. XML 格式 163 6.9.3. 遗留的Drools 2.x XML 规则格式 168 6.9.4. Automatic transforming between formats (XML and ...

    流口水:使用drools实现规则模板引擎

    流口水:使用drools实现规则模板引擎

    Drools规则引擎Workbench实战

    本课程围绕Drools规则引擎官方提供的规则管理平台Workbench(新名称Business Central Workbench)和Kie-Server的使用进行讲解。基于WildFly服务器部署Workbench和Kie-Server项目,以及在Workbench中对规则的管理、...

    Dools6规则流浅析

    之前发了个Drools5规则流使用文档,这个是Drools6的,里面包括了Drools5,有需要的只要下载这个版本的就好。 之前发的那个我会删掉。

    drools+activity入门

    drools规则引擎和activity工作流结合的maven-Web项目,该项目基于请假流程。项目中实现了动态监控规则文件和工作流文件的变更,从而实现不停止服务器达到重新加载drl和bpmn文件的效果。

    droolsExample:Drools 规则引擎示例

    流口水示例Drools 规则引擎示例。

    drools-springboot:规则引擎drools与springboot的使用,Drools动态规则与决策表

    规则引擎Drools与SpringBoot的使用 SpringBoot与Drools SpringBoot项目 略 流口水 依赖 &lt;drools&gt;6.5.0.Final&lt;/drools&gt; &lt;!--Drools--&gt; &lt;groupId&gt;org.kie &lt;artifactId&gt;kie-api ${drools.version} ...

    Drools7规则引擎从入门到精通

    课程总时长14小时,带你快速进入Drools规则引擎的世界。课程内容基础并且深入详细,适合初学者,想提升以及想深入了解Drools的开发人员。该课程也会整合当前流行的Springboot2框架、整合各种工作流框架,包括但不...

    springboot整合activiti和drools #资源达人分享计划#

    springboot整合activiti和drools,适合工作流规则引擎的需求开发者,比如风控反欺诈全自动匹配规则

    drools-规则语法

    完成这些工作的API主要有KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession、、等,它们起到了对规则文件进行收集、编译、查错、插入fact、设置global、执行规则或规则流等...

    Drools-SpringBoot:一个简单的车辆高级API,可以尝试使用Drools处理业务规则

    Drools-SpringBoot 一个简单的车辆高级API,可尝试使用Drools处理业务规则。 我目前的公司已经广泛使用Drools,因此我想通过一个有趣的小项目来了解更多信息。 我也没有做过Java / SpringBoot的任何事情,所以这可以...

    SpringBoot集成 Activiti6 Drools.docx

    在工作流中使用规则极大提高应用的可维护性。任何一个单位办事的规则是经常变化的,如果把规则写死在代码中,会带来很多的麻烦,规则变则代码必须修改。但是使用了规则任务后,规则改变之后,换一下规则文件即可,...

Global site tag (gtag.js) - Google Analytics