zoukankan      html  css  js  c++  java
  • Drools 6.5 Final 入门

    Drools 6.5 Final学习笔记

    最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Drools这个开源引擎,发现其功能强大到超出我的预期。

    什么是Drools?它是由大名鼎鼎的JBoss公司开源的规则引擎系统,可以免费下载使用,现在已经发展到6.5版本,并且7.0RC版也已经可以下载使用了。它可以集成在JavaEE项目中进行使用,其下载地址如下:https://www.drools.org/download/download.html,进入下载地址后下载Drools Engine和Drools and jBPM tools两个压缩包在Eclipse中做好相应的配置后就可以进行开发了。

    Eclipse开发环境的搭建,将Drools and JBPM tools压缩包解压后将目录inariesorg.drools.updatesite目录中的plagins和features两个子目录copy到Eclipse的各目录下,这两个子目录中的内容会和Eclipse中对应的子目录中的内容合并,然后启动Eclipse,打开Window菜单下Preferences,会发现多了Drools项,然后对Drools进行配置,如下图:

    再选择Drools Runtime将Drools Engine压缩包解压后的jar文件填加进去,如下图:

    点击OK后,选择已经填加的Runtime,如下图:

    做好这些配置后,重启Eclipse。然后新建项目,会发现项目类型中多了Drools类型,选择Drools Project,Next。

    选择第二项,创建示例项目。

    进入项目后项目结构如下:

    其中com.sample中是针对三种规则文件的测试类,resources目录下对应三种规则定义文件,分别是Excel,drl和bpmn文件,kmodule.xml中存储的kbase和kession的描述,描述如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

    <kbase name="rules" packages="rules">

    <ksession name="ksession-rules"/>

    </kbase>

    <kbase name="dtables" packages="dtables">

    <ksession name="ksession-dtables"/>

    </kbase>

    <kbase name="process" packages="process">

    <ksession name="ksession-process"/>

    </kbase>

    </kmodule>

    其中kbase的packages必须和项目中的报名一致,ksession的名字会在代码中用到,我们以drl规则文件为例看一下其怎么发挥作用的,drl规则文件对应的测试代码为DroolsTest,其规则文件定义如下:

    package com.sample

    import com.sample.Message;

    rule "Hello World"

    when

    m : Message( status == Message.HELLO, myMessage : message )

    then

    System.out.println( myMessage );

    m.setMessage( "Goodbye cruel world" );

    m.setStatus( Message.GOODBYE );

    update( m );

    end

    rule "GoodBye"

    when

    Message( status == Message.GOODBYE, myMessage : message )

    then

    System.out.println( myMessage );

    end

    其中package为自已定义的一段文字可以与代码中的不同,使用import引入需要进行规则验证的对象类型,Eclipse生成的代码是一个static类,其实可以是一个普通类,这里我们使用的对象类型为com.sample.Message,其中定义了两条规则分别为Hello World和GoodBye,其使用when 和then作为if then的表达(即如果怎样就怎样),其中rule "Hello World"中,在when短语中定义了一个Message对象m和获取Message属性message的myMessage变量,then语句总使用Message类中的方法对m对象的属性进行了更新,并使用update(m)的方式更新回了Java代码中,整个when的意思是对传入的Message对象m进行如下判断如果m.status==Message.HELLO,则执行then中的操作。

    DroolsTest.java代码如下,main方法中前三行则是为了构造Kie对象,取得了kmodule.xml中名字为ksession-rules的session,通过kSession.insert(msg)传入需要进行规则验证的对象,通过kSession.fireAllRules()执行规则。

    package com.sample;

    import java.util.ArrayList;

    import java.util.List;

    import org.kie.api.KieServices;

    import org.kie.api.runtime.KieContainer;

    import org.kie.api.runtime.KieSession;

    public class DroolsTest {

    public static final void main(String[] args) {

    try {

    // load up the knowledge base

         KieServices ks = KieServices.Factory.get();

         KieContainer kContainer = ks.getKieClasspathContainer();

    KieSession kSession = kContainer.newKieSession("ksession-rules");

    // go !

    Message message = new Message();

    message.setMessage("Hello World");

    message.setStatus(Message.HELLO);

    System.out.println(String.format("执行规则前message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));

    Message message2=new Message();

    message2.setMessage("liuyinghui");

    message2.setStatus(Message.HELLO);

    List<Message> listMsg= new ArrayList<Message>();

    listMsg.add(message2);

    listMsg.add(message);

    for (Message msg : listMsg) {

         kSession.insert(msg);

    kSession.fireAllRules();

                }

    System.out.println(String.format("执行规则后message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));

    } catch (Throwable t) {

    t.printStackTrace();

    }

    }

    }

    Message.java的定义如下:

    package com.sample;

    public class Message {

    public static final int HELLO = 0;

    public static final int GOODBYE = 1;

    private String message;

    private int status;

    public String getMessage() {

    return this.message;

    }

    public void setMessage(String message) {

    this.message = message;

    }

    public int getStatus() {

    return this.status;

    }

    public void setStatus(int status) {

    this.status = status;

    }

    }

    运行结果如下图,可以看到经过规则引擎的处理前后后message对象的变化,中间测试规则文件执行时输出的一些属性值,至此一个简单的使用Drools规则引擎的程序就开发完毕了。

  • 相关阅读:
    android中uiautomatorviewer monkeyrunner脚本地址
    python subprocess 获取执行结果
    blazor学习
    【.NET框架实战】IdentityServer4身份验证、授权
    命令行 查看当前.net和.net core版本
    github种的asp.net core源代码
    ASP.NET Core Web主机(IWebHostBuilder)
    EntityFrameworkCore教程:生成数据库表
    2021年规划
    [从0到1搭建ABP微服务]
  • 原文地址:https://www.cnblogs.com/tom-lau/p/6913315.html
Copyright © 2011-2022 走看看