- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在本教程中,我们将学习如何使用Maven作为项目生成器和最新版本的kie-Drools原型(更新至2022年10月)创建一个基本的Drools规则引擎示例项目。
硬性要求:
*JDK8或更高版本
*Maven3.x
我们首先将学习如何从shell创建项目。作为替代方案,您可以使用类似Eclipse的IDE和Drools插件或Red Hat Code Ready Studio。
为了开始,您只需要一个基本的Maven原型,您可以使用它为我们的项目设置初始结构。我们将使用的原型是kie drools原型。我们将运行它的最新版本。
从shell发出以下命令:
mvn archetype:generate -B -DarchetypeGroupId=org.kie -DarchetypeArtifactId=kie-drools-archetype -DarchetypeVersion= -DgroupId=com.sample -DartifactId=helloworld -Dversion=1.0-SNAPSHOT -Dpackage=com.sample
原型将创建一个基本的Drool项目,其中包含一个示例Rule文件和一个Java类来测试它。
让我们看看这个项目的pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>kjar</packaging>
<name>helloworld</name>
<url>http://drools.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<drools-version>7.73.0.Final</drools-version>
<slf4j-version>1.7.30</slf4j-version>
<junit-version>4.13.1</junit-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-bom</artifactId>
<type>pom</type>
<version>${drools-version}</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.kie</groupId>
<artifactId>kie-maven-plugin</artifactId>
<version>${drools-version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
如您所见,我们的项目运行最新的Drools Engine 7.73.0.Final版本。如果您想尝试Kie Server的Beta版本,只需更新Drools version属性即可。
好的,现在我们需要建立一个基于Server类的简单规则。如果Server类不满足最低要求,此规则将发出警告。
package com.sample;
public class Server {
private String name;
private int processors;
private int memory;
private int diskspace;
private boolean isValid=true;
public Server(String name, int processors, int memory, int diskspace) {
this.name = name;
this.processors = processors;
this.memory = memory;
this.diskspace = diskspace;
}
// Getter/Setters method omitted for brevity
}
接下来,在src/main/resources/rules.drl中添加一个简单的Rule文件:
import com.sample.Server
rule "Check Server Configuration"
when
$server : Server( processors < 2 || memory<=1024 || diskspace <= 2048)
then
$server.setValid(false);
System.out.println("Server "+ $server.getName() + " configuration does not meet requirements!");
end
在文件夹srm/main/resources/META-INF下,您可以找到文件kmodule.xml,它为KIE项目提供声明性配置:
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
</kmodule>
一个空的kmodule.xml文件意味着我们将使用默认KSession来插入事实并触发规则。
最后,让我们编写一个简单的Test类,它创建两个服务器对象,然后使用我们的规则验证它们:
package com.sample;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.Message;
import org.kie.api.builder.Results;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.rule.Rule;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.junit.Assert.assertTrue;
public class RuleTest {
static final Logger LOG = LoggerFactory.getLogger(RuleTest.class);
@Test
public void test() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.getKieClasspathContainer();
LOG.info("Creating kieBase");
KieBase kieBase = kContainer.getKieBase();
LOG.info("There should be rules: ");
for ( KiePackage kp : kieBase.getKiePackages() ) {
for (Rule rule : kp.getRules()) {
LOG.info("kp " + kp + " rule " + rule.getName());
}
}
LOG.info("Creating kieSession");
KieSession session = kieBase.newKieSession();
LOG.info("Now running data");
Server s1 = new Server("rhel7",2,1024,2048);
session.insert(s1);
session.fireAllRules();
assertTrue(s1.isValid());
Server s2 = new Server("rhel8",2,2048,4096);
session.insert(s2);
session.fireAllRules();
assertTrue(s2.isValid());
}
}
您可以按如下方式运行测试:
$ mvn clean install
预期结果是,第一个服务器配置将无法满足最低要求:
Server rhel7 configuration does not meet requirements!
您可以尝试增加第一台服务器的服务器值,并验证所有服务器配置现在都有效。
Drools Hello World示例的源代码位于:https://github.com/fmarchioni/mastertheboss/tree/master/drools/helloworld
值得一提的是,CDI现在已紧密集成到KIE API中。您可以使用它在代码中注入KieSession和KieBases对象。下面是如何使用CDI重写上述示例。
首先,我们需要启用CDI,因此我们将在resources/META-INF文件夹下添加beans.xml文件
$ touch src/main/resources/META-INF/beans.xml
然后,让我们添加一个CDI Bean,它将被注入默认的KSession:
package com.sample;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.kie.api.cdi.KSession;
import org.kie.api.runtime.KieSession;
import javax.inject.Inject;
public class CDIExample {
@Inject
@KSession
KieSession session;
public boolean go(Server server) {
session.insert(server);
session.fireAllRules();
return server.isValid();
}
public static void main(String[] args) {
Weld w = new Weld();
WeldContainer wc = w.initialize();
CDIExample bean = wc.instance().select(CDIExample.class).get();
Server s1 = new Server("rhel7",2,2048,1024);
boolean isValid = bean.go(s1);
System.out.println("Configuration isValid "+isValid);
w.shutdown();
}
}
正如您所看到的,这个CDIBean还包含一个main方法,因此也可以使用maven-exec插件测试示例。
最后,让我们对创建Weld容器并Assert服务器有效性的Test类进行编码:
package com.sample;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
public class RuleTest {
@Test
public void testGo() {
Weld w = new Weld();
WeldContainer wc = w.initialize();
com.sample.CDIExample bean = wc.instance().select(com.sample.CDIExample.class).get();
Server s1 = new Server("rhel7",2,2048,4096);
boolean isValid = bean.go(s1);
assertTrue(isValid);
w.shutdown();
}
}
在依赖项方面,您还必须包括cdi和weld依赖项(不包括javax.el和javax.interceptor),以便能够使用cdi容器:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.drools</groupId>
<artifactId>drools</artifactId>
<version></version>
</parent>
<groupId>com.sample</groupId>
<artifactId>helloworld-cdi</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>kjar</packaging>
<name>helloworld-cdi</name>
<url>http://drools.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<drools-version></drools-version>
<slf4j-version>1.7.26</slf4j-version>
<junit-version>4.12</junit-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-bom</artifactId>
<type>pom</type>
<version>${drools-version}</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-cdi</artifactId>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<exclusions>
<exclusion>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.interceptor</groupId>
<artifactId>javax.interceptor-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.kie</groupId>
<artifactId>kie-maven-plugin</artifactId>
<version>${drools-version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
对于我们正在测试的单个服务器,单元测试将通过:
[INFO] Running com.sample.RuleTest
Aug 14, 2020 3:37:00 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.4.1 (Final)
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Aug 14, 2020 3:37:07 PM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
Aug 14, 2020 3:37:07 PM org.jboss.weld.environment.se.WeldContainer complete
INFO: WELD-ENV-002003: Weld SE container 6efac82c-0c7d-4297-91d2-c48811e91808 initialized
Aug 14, 2020 3:37:08 PM org.jboss.weld.environment.se.WeldContainer shutdown
INFO: WELD-ENV-002001: Weld SE container 6efac82c-0c7d-4297-91d2-c48811e91808 shut down
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.391 s - in com.sample.RuleTest
该项目在github https://github.com/fmarchioni/mastertheboss/tree/master/drools/helloworld-cdi上提供
通过以下教程继续学习Drools:
在Drools中,决策表是一种根据输入电子表格的数据生成规则的方法。电子表格可以是标准Excel(XLS)或CSV文件。
Kie Server是一个Java web应用程序,它允许我们公开使用REST和JMS接口远程执行的规则和业务流程。以下教程显示了如何在WildFly上安装它:在WildFly上配置Kie Execution Server
熟悉Kie Execution Server之后,您就可以了解如何安装Business Central,以便在其中设计、构建和部署资产。
我的 CS2 讲师给出了一个 java 正则表达式,用于检查单词是否重复: \\b(\\w+)\\s+\\1\\b 如何修改它来检查某个单词是否重复两次,如“hello hello hello”或“h
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
这个问题已经有答案了: printf anomaly after "fork()" (3 个回答) 已关闭 3 年前。 #include #include Void main() { Printf
我一直在分配以下作业来解释 3 个语句中发生的事情,但我无法弄清楚。 cout << ("hello" + 1); // ello cout << (*"hello") + 1; // 10
如何确定用户是否使用 hello.js 登录? 使用 Google Sign-In SDK,我可以使用 gapi.auth2.init() 注册回调,当设置 SDK 并准备好回答诸如“你是登录了吗?”
执行String S1 = "hello";后,JVM将在SCP中创建一个String对象,该对象将在value字段中保存一个字符数组,如 s1.value = {'h', 'e', 'l', 'l'
我正在 build gomobile Hello示例应用程序,但遇到以下问题:在 Xcode (7.1) 中打开应用程序后尝试构建并运行该应用程序时,出现错误“找不到 hello/Hello.h”文件
#coding=utf-8 '''Tkinter module''' from Tkinter import * import time root=Tk() t=Text(root,fg='red')
在C/C++中,下面两行代码有什么区别: char *str1="hello"; char *str2={"hello"}; 最佳答案 根据 2011 C 标准,条款 6.7.9 初始化,第 11
我对在 android studio 中导入 import.hello.Hello 时出错有疑问,如下图所示。请给我解决方案如何解决这个错误 最佳答案 请参阅此处 @Arpit Patel answe
hello/ 忽略文件夹结构中任何位置名为“hello”的所有文件夹 hello/* 仅忽略顶级文件夹“hello”。 这是为什么?请指出http://git-scm.com/docs/gitigno
请解释以下程序中发生了什么。 我在程序的开头和结尾检查了 strerror(errno) 返回的地址,并确认它每次都返回相同的地址。然后一旦确定这一点,在第一种情况下我继续将相同的地址分配给 ptr,
在整个互联网上你都会看到这个命令 alias hello='echo Hello' 是的,我知道以上是一个蹩脚的例子,但它不是重点。如果我执行它,它就会起作用。但是当我重新启动计算机时,它丢失了。为什
我正在学习 C++ 指针,而 -> 运算符对我来说似乎很奇怪。代替ptr->hello(); 可以写成 (*ptr).hello(); 因为它似乎也可以工作,所以我认为前者只是更方便方式。 是这样还是
这个问题在这里已经有了答案: About the changing id of an immutable string (5 个回答) 关闭4年前。 为什么 "hello"is "hello" 在 P
我需要Prolog的源代码,它用于与Weka连接,并且能够在Windows环境下使用Weka算法进行预测。我尝试通过 Java 连接,但无法使用 Java 和 Prolog 进行连接和预测。 最佳答案
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Capitalize First Char of Each Word in a String Java 编写进行以下
当我在 ruby 控制台中运行以下示例时,我感到很惊讶。它们都产生相同的输出。 "hello".length 和 "hello" .length ruby
我创建了一个Hello World应用,系统生成了下面大部分的Android语言。在没有 System.out 语句的情况下运行应用程序时,模拟器中不会显示“Hello”。然后,使用 Eclipse
是的,所以我正在制作一个沼泽标准 Hello world 以确保 android 正常工作。这是我第一次使用 android,所以我正在设置环境。我按照以下程序制作了程序:http://develop
我是一名优秀的程序员,十分优秀!