Drools——编写和执行规则(一)

学习任何新得事物最好的方式就是去尝试。因此,在本章节,我们开始切入编写和执行我们第一个规则。我们将会涵盖大多数关于规则语言重要的点,如何高效的编写对你领域有意义的规则。这个章节将会使用前一章介绍的eShop的模型来演示一系列规则应用的场景。

在我们开始编写之前,在这章的前半部分,你会学到如何安装使用Drools所需要的所有的标准工具和这本书提供的示例。你将会从头开始创建项目,因此,你会用到本章作为从头开始创建应用的参考。第二半部分,我们会涵盖DRL语言的介绍,当你使用规则或其他知识断言(比如业务流)时建议你如何组织项目。

对上面简单介绍下,本章节将涵盖一下主题:

  • 安装环境
  • 创建第一个Drools项目
  • 编写和执行第一个规则
  • 讨论DRL规则语言
  • 组织项目

安装环境

为了开始使用规则,我们需要考虑这些问题。首先我们将会依赖Maven来为我们的项目提供结构。如果你对它不熟悉,我强烈建议你了解下Maven, 因为Drools和JPMN大多数基础设施是依赖的Maven的。因此,当你明白它是如何使用的,你会感觉到非常的舒服。如果你是Maven的新手,我建议你看下Maven工程的站点链接

https://maven.apache.org/guides/getting-started/index.html

对于Drools来讲它不是一定需要的,但是还是建议使用它。大多数工程工具和其他模块的集成,依赖Maven服务器作为项目结构、项目生命周期和依赖管理的标准。

开始之前,我们需要确认以下软件是否在电脑上已经安装完毕:

  • jdk1.8,注意Drools并不需要jdk1.8,但是书中的示例是需要使用它的。为了避免在示例中遇到问题,我们建议你使用这个版本
  • 使用Maven3.1.*对我们的项目进行编译、构建、测试
  • 源码管理上使用GIT1.9.*或更高的版本

我们将会使用git获取托管在Bitbucket仓库中的示例工程,如果你对git不熟悉,我建议您好好看一下git的官方文档。

http://git-scm.com/docs

为了可以在本地环境中获取一份复制的示例工程,我们将会在终端执行命令去克隆在远程仓库中的示例。

git clone https://bitbucket.org/drools-6-developer-guide/drools6-dev-guide.git

执行的时候依托于你的操作系统,你需要使用git客户端与远程仓库进行交互。这里是git项目提供的列表,你可以随意选择适合你操作系统的方案

http://git-scm.com/downloads/guis

现在,你的本地环境已经有了这本书的所有的示例副本。确认下所有的事情现在都已经安装,去drools6-dev-guide/文件夹下,执行mvn clean install。这个命令是告诉maven从工程中清除掉所有之前编译的类、打包的资源文件,并开始一个新的编译进程。为了可以成功编译,maven需要确认该工程需要的第三方依赖。对我们而言,drools也是第三方库,如果本地没有的话,我们将需要从通过maven进行下载。而且,它不光可以编译Java class,还可以执行工程中定义的所有的测试类,并且如果所有测试都成功的话,还能对工程进行打包。

在你的本地环境第一次执行的时候,这个进程会进行下载,编译并执行所有的测试。这是主要是由于这是第一次下载,除非你是用SNAPTHOTS,这只会发生在你第一次执行命令时。注意,托管示例的仓库没有承载任何第三方库,甚至也没有Drools。

现在我们知道JDK和Maven的正确的工作方式,我们准备去创建我们第一个Drools工程把。

创建第一个Drools工程

正如前面的章节提及的那样,我们使用Maven提供给我们的工程结构。针对这个,Maven提供了骨架的概念,骨架就是我们用来引导工程的模板。大部分IDE为了创建和初始化工程都提供了让我们使用骨架的方式。请检查你的IDES是否已经下载了你需要的Maven插件或已经绑定了Maven。如果你想使用命令行来实现这个这个操作,你可以执行下面的命令:

mvn -B archetype:generate 
 -DarchetypeGroupId=org.apache.maven.archetypes 
 -DgroupId=org.drools.devguide
 -DartifactId=myfirst-drools-project

建议你在文件夹drools6-dev-guide/chapter-02/下执行这个命令。这会让Maven继承定义在其父工程drools6-dev-guide/pom.xml中的所有配置。如果你这么做了,你的工程将会知道本书中所有其他示例中Drools的版本,这样就会避免你在下面的章节中再定义其他的Drools版本。

注意,你可以改变groupId的值,它表示你应用所属的逻辑组,还有artifactId,它表示你特定的Maven模板的名字。这个命令会让你在文件夹 myfirst-drools-project下创建一个工程。

一旦我们执行了这个命令,一个新的工程结构就已经为我们准备好了。这个结构就像下面图中表示的差不多

 

 

下面是一些非常重要的事情:

pom.xml:它包含了工程的定义和一级依赖。强烈建议你打开这个文件并好好看看它。你需要去了解如何改变pom文件来导入新的依赖或改变工程配置。

  • src/main/java:它包含了所有需要编译的Java类。
  • src/test/java:它包含了所有需要编译的测试类,并在测试期间执行。
  • src/main/resources:它包含了所有不需要编译的静态资源文件,因此它需要独立于Java类打包。
  • src/test/resources:它包含了所有不需要编译的静态测试资源文件,因此我们的测试类需要它。

这个基础结构服务作为任何一个Java工程的起点,无论你在工程里使用什么框架。为了能在工程中使用Drools,我们需要在pom.xml中定义框架的依赖。为了使用Drools,我们需要在工程中添加下面的依赖(在dependencies标签中)。

<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.drools.devguide</groupId>
		<artifactId>chapter-02</artifactId>
		<version>1.0</version>
	</parent>
	<artifactId>myfirst-drools-project</artifactId>

	<dependencies>
		<dependency>
			<groupId>org.kie</groupId>
			<artifactId>kie-api</artifactId>
		</dependency>
		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.drools</groupId>
			<artifactId>drools-compiler</artifactId>
		</dependency>
	</dependencies>
</project>

第一个kie-api包含了由Drools、JBPM和OptaPlanner组成的KIE平台暴漏的所有接口。下一个我们包含了org.drools:drools-core租组件,它包含了规则引擎的实现。最后我们包含了 org.drools:drools-compiler组件,它包含了将写在不同资源下(txt、表格、自定义类型等)要规则翻译成可执行规则的算法。这个组件是必须的,因为我们需要编译在工程中的规则。我们可以将规则编译从规则执行中区分开,以从工程中移除该依赖。因此为了简单起见,我们将会在相同的工程中编译我们的规则。

为了针对我们的领域开始编写规则,我们将要向它添加一个依赖。如下所示,这个依赖定义了本书示例中提供的领域模型。

<dependencies>
 (... Drools dependencies here … )
 <dependency>
 <groupId>org.drools.devguide</groupId>
 <artifactId>model</artifactId>
 </dependency>
</dependencies>

正如我们将要在下一章节看到的那样,通过这种方法,我们可以添加我们想要的很多依赖,并且可以直接使用第三方库提供的类。为了完成我们工程的配置,这是最后一件需要做的事情,在文件夹中chapter-02/myfirst-drools-project/src/
main/resources/META-INF/中定义的名字为kmodule.xml的文件。这个文件将会用来配置如何加载定义在使用drools的工程中的规则。现在来说,因为我们将要使用的所有的默认的配置,kmodule.xml中的内容是非常简单。下面就是一个空的kmodule.xml文件的示例。

<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://jboss.org/kie/6.0.0/kmodule">
</kmodule>

我们将会在第三章看到如何自定义该文件更细粒度的设置。当我们自动初始化规则引擎的session来断定需要加载的内容时,这个文件将会被搜取。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章