您的位置:首页 > 其它

13、规则流的应用及说明

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

下面就通过开发工具做一个规则流的
首先eclipse提供了这要的一个插件 
选择“安装新软件…从帮助菜单”。加入Drools和jBPM更新站点http://downloads.jboss.org/jbpm/release/6.0.0.Final/updatesite/。您应该看到如下所示的插件。注意,您还可以下载并解压缩Drools和jBPM更新站点到您的本地文件系统,并使用它作为当地更新站点。注:
该插件 在6.4之后不在使用 所以在6.4之后用的是bpmn or bpmn2

http://download.jboss.org/drools/release/6.4.0.Final/org.drools.updatesite/  注: 该插件为6.4的插件 安装成功后你会发现该插件并没有新建bpmn的地方,不要慌,我们可能通过copy的方式解决这个问题,不过这是很笨的方法 ,博主还没有找到更好的方式



下面是6.0插件的例子:下载安装成功后,在新建中可以看到如下图一样的工具


所以有的drl文件是


好,那我们开始做一个规则中的工作流:
第一步骤:新建一个Flow File的文件 格式为 *.rf  以图说明注:在6.4版本中 *.rf 是已经淘汰了,但功能说bpmn 是一样的


填写文件名


点击下一步后会出现下面的效果图:



这样 就会在 所创建的工作目录中出现

的文件,创建部分到这里就结束了
 注:虽然.rf在6.4中已经不在使用,但功能上与bpmn是一样的,好我们接着往下看。

第二个步骤:编辑  .rf文件的几个重要步骤

首先要将

窗口打开方便编辑

刚新建完的*.rf 文件 窗口是这样的



那我们开始新建一个简单的工作流:通过连线之间的组件



具体的配置如下:
第一步:不选中任何组件,全局配置



第二步:配置任务组件



第三步骤:新建一个drl文件



第四步骤:写java代码

package test.flow;

import java.util.HashMap;
import java.util.Map;

import org.drools.KnowledgeBase;
import org.drools.builder.ResourceType;
import org.drools.runtime.StatefulKnowledgeSession;
import org.junit.BeforeClass;
import org.junit.Test;

import util.DroolsHelper;

public class Test_01_规则流入门2 {
//定义一个 ResourceType    String[]  的map.
static Map<ResourceType, String[]> resourceMap = new HashMap<ResourceType, String[]>();
@BeforeClass
public static void init() {   //将 .rf .drl文件 写到map中
resourceMap.put(ResourceType.DRF, new String[]{
"rule/flow/No1_规则流入门.rf"
});
resourceMap.put(ResourceType.DRL, new String[]{
"rule/flow/No1_规则流入门.drl"
});
}
@Test
public void test01() {
KnowledgeBase kbase = DroolsHelper.buildKbase(resourceMap);
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
try {
ksession.startProcess("No1_drools");//注: 通过startProcess指定 .rf文件中的id
ksession.fireAllRules();
} finally {
ksession.dispose();
}
}

}
运行结果




以上是5.x版本的规则流
Drools6.4版本规则流:
6.4版本与5.x版本的一些差异:
   第一: 通过用插件6.2以上版本 会出现一个问题,就是没有新建 rf 或者bpmn的地方



    第二: 6.4版本的api 执行方式与5.x也有不一样的地方:
                首先,先是drools配置文件即  kmodule.xml:



 红框的地方要注意:是package 和相关文件的配置              
   

  
*.drl文件



    这里的规则流文件是有一些小出入的,就是扩展名不同,*.bpmn  因为在6.4版本里,是将rf淘汰了,但如果想用rf 的话,可以通过一些过期的方法使用,上面就有例子,这里不多说明。 bpmn 和 rf  的配置是一样的, 这里不多说.
真正去执行 java
 

    可以通过 ksession.startProcess方法执行要执行的流程,注:如果在规则文件
有一些规则没有设置ruleflow-group的话,也会将其执行。
怎么理解呢:我们要明白一个说法,规则是规则,流程是流程,在规则中设置了ruleflow-group属性,如果没有执行流程的调用,则该规则不会执行,但其他未设置ruleflow-group属性的规则会根据LHS
部分的判断来执行规则

还有一种情况,如果我们只调用了startProcess方法,没有执行规则的调用,那规则也是不会执行的。

引用文件的最常用的写法,基于Drools6.4的版本
@Test
public  void ruleDaseTestbms() throws IOException {
Resource bpmn = ResourceFactory.newClassPathResource("rules/No4_规则流入门.bpmn", Test_01_规则流入门.class);
Resource drl = ResourceFactory.newClassPathResource("rules/No1_规则流入门2.drl", Test_01_规则流入门.class);
KieHelper helper = new KieHelper();
helper.addResource(bpmn,ResourceType.BPMN2);
helper.addResource(drl,ResourceType.DRL);
KieSession ksession = helper.build().newKieSession();
Map<String, Object> map=new HashMap<String, Object>();
map.put("name", "张三");
ksession.startProcess("com.sample.process",map);
int i = ksession.fireAllRules();
System.out.println( "     " + i + "次");
ksession.dispose();
}


规则流中的事件:




1、如果在drl等规则中设置了ruleflow-group的名字是相同的,在执行规则时,都会执行,默认是从上至下的执行
在流程中只定义了一个规则元素
举例说明



执行后的结果



2、如果在流程文件中定义两个相同的规则元素,且设置的    RuleFlowGroup也是相同的 也只会执行一次





规则文件如下:



输出的结果:



如果在流程文件中有两个规则元素,并且RuleFlowgroup的值是不同的。
举例说明 :如下图:





在规则文件中定义
package rules;

rule "规则1"
ruleflow-group "No5_drools_RuleFlow"
when
eval(true)
then
System.out.println('这是规则流的第一个方法');
end

rule "规则2"
ruleflow-group "No4_drools_RuleFlow"
when
eval(true)
then
System.out.println('这是规则流的二个方法');
end

rule "规则3"
ruleflow-group "No4_drools_RuleFlow"
when
eval(true)
then
System.out.println('这是规则流的第三个方法');
end

rule "规则4"
ruleflow-group "No5_drools_RuleFlow"
when
eval(true)
then
System.out.println('这是规则流的第四个方法');
end


流程会根据执行顺序执行满足条件的规则:



4、如果在规则文件中ruleflow-group的属性值在流程文件中规则元素没有体现,则规则不执行。
5、如果在规则中指定了salience  的优先级,则会根据优先级去执行匹配的规则 例如:





输出的结果会是


6、如果在规则文件中相同的规则流设置了activation-group,则执行也会根据分组后的规则执行。
7、如果在规则文件中不同的规则流设置了activation-group,则执行也会根据分组后的规则执行。

在规则流中如何引用java方法。我们这里写一个例子
首先我们定义一个java类。要注意的是,想要在规则流中调用java的方法,方法必须是静态的,或者通过一个静态常量的形式引用方法。
或者也通过通过构造函数的方法。
下面我们看一下这两种不同的写法:
第一种:



第二种:



下面我开始编写bpmn文件



引用java类的图例



如果要引用多个,在后面追加及可,与java类引用是一样的



调用方法



还有一种写法:



最后输出的结果:



还有传参的方式:java代码



在引用过程中也必须要加的,但要注意的是,传入的值必须是一个Map<Stirng,Object>的集合



因为我们在map中的key值是name,所以在规则流中定义的参数接收也是name 否则接收不到。







然后直接将变量引用及可。



如果想了解更多的 流程中节点的使用 请参考:http://blog.csdn.net/u013115157/article/details/52240597
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  drools 业务流程