6

作为一名开发人员,我想创建一个 Maven 项目并构建一个可执行的独立 JAR 应用程序。(没有弹簧靴)

在开发和构建过程中,我想添加一个 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();

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

  • 不想在我的生产服务器上安装 Maven
  • 希望我的应用程序扫描本地或远程 Maven 存储库
  • 我希望我的应用程序自动定期扫描我的 Drools Kie 工件的新版本,而不需要任何 Maven 存储库,只需查看文件系统

我试过了

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(例如 libs/mydrools-1.0.0.jar)作为依赖项的 JAR,并可能在更新 libs/mydrools-1.0.0.jar 时动态重新加载该依赖项。

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

Drools 6.2.0.Final 怎么可能做到这一点?

更新

这个问题与

完全离线使用 Drools 6 Maven 架构

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

4

2 回答 2

5

答案是你没有。KIE 6.*(和 7)内置了 maven,KieScanner 类使用 maven 来查找更新。如果您在 ReleaseId 中指定版本范围,例如 [1.0.0,),扫描仪会更好地工作

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

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

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

于 2016-05-13T21:11:45.217 回答
3

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

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

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

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

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

于 2018-10-26T18:25:17.303 回答