没有 Maven 的 Drools Kie 应用程序

Drools Kie application without Maven

作为一名开发人员,我想创建一个 Maven 项目并构建一个可执行的独立 JAR 应用程序。 (无Spring引导)

在开发和构建过程中,我想添加一个 Drools Kie 工件作为依赖项

<dependency>
 <groupId>com.mycompany</groupId>
 <artifactId>mydrools</artifactId>
 <version>[1.0.0,)</version>
</dependency>

将我的应用程序构建为可执行 Jar 并 运行 它。我的应用程序具有调用 Drools 引擎的代码:

KieSession kSession = kContainer.newKieSession();
kSession.insert(myBean);
kSession.fireAllRules();

最重要的是,当我在生产环境中部署我的应用程序时:

我试过

String fileName = System.getenv("HOME") + "/libs/mydrools-1.0.0.jar";
File file = new File(fileName);
KieRepository kieRepository = ks.getRepository();        
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId("com.mycompany", "mydrools", "1.0.0"));
kieRepository.addKieModule(ks.getResources().newFileSystemResource(file));
KieScanner kScanner = ks.newKieScanner( kContainer );
kScanner.start( 10000L );

加载 JAR 工作正常,但似乎我还被迫至少配置一个最小的 Maven 存储库(~/.m2 文件夹和一个 settings.xml)。 org.apache.maven 插件和相关的 类.

我得到了一堆错误

我当然希望我的生产环境依赖或依赖任何 Maven 配置。我只想 运行 一个 JAR 和另一个 JAR(例如 libs/mydrools-1.0.0.jar)作为依赖项,并可能在我更新 libs/mydrools-1.0 时动态重新加载该依赖项。 0.jar.

基本上我需要将内部 Drools Kie Maven 插件设置为完全禁用(离线)。

如何使用 Drools 6.2 执行此操作。0.Final?

更新

此问题与

密切相关

Using Drools 6 Maven architecture completely offline

http://lists.jboss.org/pipermail/rules-users/2014-June/036245.html

答案是你不知道。 KIE 6.*(和 7)内置了 maven,KieScanner class 使用 maven 查找更新。 如果您在 ReleaseId 中指定一个版本范围,例如[1.0.0,)

我的公司正在将基于 KIE 的应用程序部署到生产环境中。我们正在 PROD 中设置一个 Artifactory 存储库,并且还将有一个 maven 存储库。

您基本上可以通过不使用 KieScanner 来禁用 Maven 部分,而是使用 getKieClasspathContainer() 来获取 KIE 容器。不过,您不会对规则进行动态更新。

KIE 还提供了一个将规则推送到 REST API 中的执行服务器。执行服务器规则也可以通过 maven 更新。

从架构上讲,您具有三种规则部署模型:

模型 #1 是动态规则更新模式。 在 5.3 中,它通过 http 拉取编译 类,现在在 6 和 7 中,它使用 maven 作为传输,因为它提供版本控制,是迄今为止最多产的工件版本控制和传输工具。在这种模式下,您有一个生产应用程序(jar 或 war),它从 maven 存储库(如果您愿意,可以为 PROD 提供专用的 maven 存储库)中提取规则(通过 kie-ci 通过 maven aether) ).如果你使用这个模型,那么你需要 kie-ci 作为依赖,它会神奇地在引擎盖下使用 maven。

您可以使用扫描器并配置一个没有 <servers> 的 Maven settings.xml,因此它应该只从生产服务器 ~/.m2 文件夹中提取, 允许您部署到服务器文件系统并使用 OOTB 扫描器,而没有任何从外部拉取的危险。

模型 #2 是一个不可变的规则模型。 所以概念是您将规则作为资源嵌入到应用程序中,它们无法更新。这适用于不可变部署,例如 CD 管道和需要测试应用程序当前状态的 container/docker 部署。话虽如此,容器并不禁止动态更新的选项,但我是从纯粹的架构角度讲的。为此,请从 deps 中省略 kie-ci 并使用 'getKieClasspathContainer()'(如谁所说)从资源文件夹加载规则,并且它永远不会尝试在不重新部署应用程序的情况下进行更新。

模型 #3 是一种集中式 "server" 模式(由于用途有限,我只是为了完整性而添加它)。它是您在应用程序运行时之外集中执行规则的地方,因 IBM 的规则(和营销)引擎而流行。但是,对于大多数用例而言,它的性能较差,但在您想要交叉收费的托管服务类型应用程序中除外。它不会随着应用程序自然扩展,实体必须通过网络 de/serialized 因此性能很差等等。但是你确实得到了中央日志记录。