• Drools规则引擎环境搭建


    Drools 是一款基于Java 的开源规则引擎,所以在使用Drools 之前需要在开发机器上安装好JDK 环境,Drools5 要求的JDK 版本要在1.5 或以上。

    Drools5 提供了一个基于Eclipse3.4 的一个IDE 开发工具,所以在使用之前需要到http://eclipse.org 网站下载一个3.4.x 版本的Eclipse , 下载完成之后, 再到
    http://jboss.org/drools/downloads.html 网站,下载Drools5 的Eclipse 插件版IDE 及Drools5的开发工具包,如图1-1 所示。

    将下载的开发工具包及IDE 包解压到一个非中文目录下,解压完成后就可以在Eclipse3.4 上安装Drools5 提供的开发工具IDE 了。

    打开Eclipse3.4 所在目录下的links 目录(如果该目录不存在可以手工在其目录下创建一个links 目录),在links 目录下创建一个文本文件,并改名为drools5-ide.link,用记事本打开该文件,按照下面的版本输入Drools5 Eclipse Plugin 文件所在目录:path=D:\eclipse\drools-5.0-eclipse-all这个值表示Drools5 Eclipse Plugin 文件位于D 盘eclipse 目录下的drools-5.0-eclipse-all下面,这里有一点需要注意,那就是drools-5.0-eclipse-all 文件夹下必须再包含一个eclipse目录,所有的插件文件都应该位于该eclipse 目录之下,接下来要在win dos 下重启Eclipse 3.4,检验Drools5 IDE 是否安装成功。进入win dos,进入Eclipes3.4 所在目录,输入eclipse –clean 启动Eclipse3.4。启动完成后打开菜单WindowPreferences,在弹出的窗口当中如果能在左边导航树中发现Drools 节点就表示Drools5 IDE 安装成功了,如图1-2 所示。

    IDE 安装完成后,接下来需要对Drools5 的IDE 环境进行简单的配置,打开菜单WindowPreferences,在弹出的窗口当中选择左边导航树菜单DroolsInstalled Drools
    Runtimes 设置Drools5 IDE 运行时依赖的开发工具包,点击“Add…”按钮添加一个开发工具包,如图1-3 所示。

    图 1-3 当中添加了一个开发工具包,名称为“drools-5.0.0”,对应的工具包目录为D 盘docabout ruledrools5.xdrools-5.0-bin 目录。添加完成后这样Drools5 的开发环境就搭好了。
    下面我们就来利用这个环境编写一个规则看看运行效果。

    编写第一个规则

    环境搭建好后,新建一个Drools Project项目,为项目取好名字后直接finish。

    项目结构如图1-4

    我们打开DroolsTest.java看看

     1 package com.sample;
     2 
     3 import org.drools.KnowledgeBase;
     4 import org.drools.KnowledgeBaseFactory;
     5 import org.drools.builder.KnowledgeBuilder;
     6 import org.drools.builder.KnowledgeBuilderError;
     7 import org.drools.builder.KnowledgeBuilderErrors;
     8 import org.drools.builder.KnowledgeBuilderFactory;
     9 import org.drools.builder.ResourceType;
    10 import org.drools.io.ResourceFactory;
    11 import org.drools.logger.KnowledgeRuntimeLogger;
    12 import org.drools.logger.KnowledgeRuntimeLoggerFactory;
    13 import org.drools.runtime.StatefulKnowledgeSession;
    14 
    15 /**
    16  * This is a sample class to launch a rule.
    17  */
    18 public class DroolsTest {
    19 
    20     public static final void main(String[] args) {
    21         try {
    22             // load up the knowledge base
    23             KnowledgeBase kbase = readKnowledgeBase();
    24             StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    25             KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
    26             // go !
    27             Message message = new Message();
    28             message.setMessage("Hello World");
    29             message.setStatus(Message.HELLO);
    30             ksession.insert(message);
    31             ksession.fireAllRules();
    32             logger.close();
    33         } catch (Throwable t) {
    34             t.printStackTrace();
    35         }
    36     }
    37 
    38     private static KnowledgeBase readKnowledgeBase() throws Exception {
    39         KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    40         kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
    41         KnowledgeBuilderErrors errors = kbuilder.getErrors();
    42         if (errors.size() > 0) {
    43             for (KnowledgeBuilderError error: errors) {
    44                 System.err.println(error);
    45             }
    46             throw new IllegalArgumentException("Could not parse knowledge.");
    47         }
    48         KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    49         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
    50         return kbase;
    51     }
    52 
    53     public static class Message {
    54 
    55         public static final int HELLO = 0;
    56         public static final int GOODBYE = 1;
    57 
    58         private String message;
    59 
    60         private int status;
    61 
    62         public String getMessage() {
    63             return this.message;
    64         }
    65 
    66         public void setMessage(String message) {
    67             this.message = message;
    68         }
    69 
    70         public int getStatus() {
    71             return this.status;
    72         }
    73 
    74         public void setStatus(int status) {
    75             this.status = status;
    76         }
    77 
    78     }
    79 
    80 }
    View Code

    KnowledgeBase:Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象,通过KnowledgeBaseFactory 对象提供的newKnowledgeBase()方法来实现

    KnowledgeBuilder:用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用,KnowledgeBuilder 在编译规则的时候可以通过其提供的hasErrors()方法得到编译规则过程中发现规则是否有错误

    StatefulKnowledgeSession:插入业务对象,触发规则执行或开始一个规则流执行。

    KnowledgeRuntimeLogger:规则运行日志

    DroolsTest.java首先通过readKnowledgeBase()方法获取KnowledgeBase,在readKnowledgeBase()里面载入规则文件,然后在StatefulKnowledgeSession里面放入了一个Message对象,然后调用fireAllRules()开始执行规则。

    DroolsTest里面还定义了一个Message对象,Message有两个属性message和status,两个常量:HELLO和GOODBYE

    我们再看看规则文件Sample.drl

     1 package com.sample
     2  
     3 import com.sample.DroolsTest.Message;
     4  
     5 rule "Hello World"
     6     when
     7         m : Message( status == Message.HELLO, myMessage : message )
     8     then
     9         System.out.println( myMessage );
    10         m.setMessage( "Goodbye cruel world" );
    11         m.setStatus( Message.GOODBYE );
    12         update( m );
    13 end
    14 
    15 rule "GoodBye"
    16     when
    17         Message( status == Message.GOODBYE, myMessage : message )
    18     then
    19         System.out.println( myMessage );
    20 end

    rule "Hello World","Hello World"值规则的名称,Rule非常像java里面的一个if...else....

    rule "Hello World"描述的逻辑大概为:insert进来的对象如果是一个Message对象,并且Message的status属性等于Message.HELLO,那么将Message的message属性赋值给myMessage,最后将Message对象赋予给m。在then部分打印了myMessage,然后将新的Message对象m的message和status进行修改."Hello World"执行完毕,此时应该在控制台打印输出:Hello World。接下来执行rule "GoodBye".

    rule "GoodBye"描述的逻辑为:判断对象是否为一个Message对象,并且Message的status属性等于Message.GOODBYE,将Message的message属性赋值给myMessage,然后在控制台打印myMessage,控制台应该输出:Goodbye cruel world。

    好了,我们在DroolsTest.java中运行看看是不是和我们预计的一样.运行方式选择Java运行程序

    可以看到控制台输出:

    Hello World
    Goodbye cruel world

  • 相关阅读:
    USGS DEM文件格式说明
    GIS三维地景仿真设计之地景的数学处理
    GIS系统里DEM文件和DXF文件读取
    NSDTFDEM 文件头格式说明
    ArcGIS 9.3下载 ArcGIS 9.2下载(包含ArcGIS Desktop、ArcGIS Engine、ArcGIS Server、ArcSDE、workstation)
    读取USGS DEM数据显示三维分层设色地图
    关于DEM文件的介绍和应用
    DEM数据文件的读取与保存
    linux 下绑定多个IP
    shell 语法之 if
  • 原文地址:https://www.cnblogs.com/gavinYang/p/3500574.html
Copyright © 2020-2023  润新知