您的位置:首页 > 其它

规则流的应用及说明

2016-07-05 11:28 344 查看
转自:http://note.youdao.com/share/?id=1f7d4c261bb6494b8fde78957e3e0123&type=note#/

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更新站点到您的本地文件系统,并使用它作为当地更新站点。
http://download.jboss.org/drools/release/6.4.0.Final/org.drools.updatesite/
下载安装成功后,在新建中可以看到如下图一样的工具


所以有的drl文件是


好,那我们开始做一个规则中的工作流:
第一步骤:新建一个Flow File的文件 格式为 *.rf  以图说明 


填写文件名


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



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

的文件,创建部分到这里就结束了

第二个步骤:编辑  .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配置文件:
                    


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


                   *.drl文件
                  


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

                 正真去执行 java
                


                 可以通过 ksession.startProcess方法执行要执行的流程,注:如果在规则文件 有一些规则没有设置ruleflow-group的话,也会将其执行。 

package util;

import java.util.Collection;
import java.util.Map;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;

public class DroolsHelper {

    public static KnowledgeBase buildKbase(String classpathResource) {
        return buildKbase(classpathResource, null);
    }

    public static KnowledgeBase buildKbase(String classpathResource, ResourceType type) {
        System.setProperty("drools.dateformat","yyyy-MM-dd");
        KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        type = null == type ? ResourceType.DRL : type;
        builder.add(ResourceFactory.newClassPathResource(classpathResource), type);
        if (builder.hasErrors()) {
            throw new RuntimeException(builder.getErrors().toString());
        }
        KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
        Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
        knowledgeBase.addKnowledgePackages(pkgs);
        return knowledgeBase;
    }

    public static KnowledgeBase buildKbase(Map<ResourceType, String[]> resourceMap) {
        System.setProperty("drools.dateformat","yyyy-MM-dd");
        KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        for (Map.Entry<ResourceType, String[]> entry : resourceMap.entrySet()) {
            for (String path : entry.getValue()) {
                builder.add(ResourceFactory.newClassPathResource(path), entry.getKey());
            }
        }
        if (builder.hasErrors()) {
            throw new RuntimeException(builder.getErrors().toString());
        }
        KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
        Collection<KnowledgePackage> pkgs = builder.getKnowledgePackages();
        knowledgeBase.addKnowledgePackages(pkgs);
        return knowledgeBase;
    }

    /**
     * 解析规则资源得到规则包
     * @param resourceMap 规则资源map
     * @return 规则包列表
     */
    public static Collection<KnowledgePackage> parseKPackages(Map<ResourceType, String[]> resourceMap) {
        System.setProperty("drools.dateformat","yyyy-MM-dd");
        KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        for (Map.Entry<ResourceType, String[]> entry : resourceMap.entrySet()) {
            for (String path : entry.getValue()) {
                builder.add(ResourceFactory.newClassPathResource(path), entry.getKey());
            }
        }
        if (builder.hasErrors()) {
            throw new RuntimeException(builder.getErrors().toString());
        }
        return builder.getKnowledgePackages();
    }
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  drools