【问题标题】:Loading Drools/KIE Workbench artifacts directly from the repository直接从存储库加载 Drools/KIE Workbench 工件
【发布时间】:2014-02-06 19:45:15
【问题描述】:

我们尝试使用全新的 KIE 工作台(以前称为 Guvnor)和新的基于 maven 的工件切换到 Drools 6。

现在我想使用第二张图片(“部署”)中this blog post 中描述的系统:通过 HTTP 从工作台存储库加载规则(虚线箭头,从左侧的 HTTP 直接进入应用程序)。

问题是,我不知道如何将工件加载到我的 KieServices/KieModule 对象中。我基本上不想用maven,我也不能全局提供maven的settings.xml的路径作为Java参数,所以这个选项没有了。

我认为类似的问题是this one。正如那里提到的,我也尝试加载一个 URL 资源,但问题似乎是系统无法确定给定 URL (http://localhost:8080/kie-drools/maven2/.../-1.0.0.jar) 是什么类型的 ResourceType。是的,我可以直接从浏览器访问存储库中的 .jar,无需身份验证。

任何想法或教程如何做到这一点?

我的测试代码:

public static void main(String[] args) {
    KieServices ks = KieServices.Factory.get();
    KieRepository repo = ks.getRepository();

    String url = "http://localhost:8080/kie-drools/maven2/de/test/test/1.0.0/test-1.0.0.jar";

    Resource urlResource = ks.getResources().newUrlResource(url);
    KieModule kModule = repo.addKieModule(urlResource); // this already fails
}

错误:

Exception in thread "main" java.lang.RuntimeException: Unable to fetch module from resource :[UrlResource path='http://localhost:8080/kie-drools/maven2/de/itm/Herma400/1.0.1/Herma400-1.0.1.jar']
    at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.getKieModule(KieRepositoryImpl.java:205)
    at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.addKieModule(KieRepositoryImpl.java:161)
    at kieTest.MainKieTest.main(MainKieTest.java:24)
Caused by: java.lang.NullPointerException
    at org.drools.compiler.kie.builder.impl.ClasspathKieProject.getPomProperties(ClasspathKieProject.java:197)
    at org.drools.compiler.kie.builder.impl.ClasspathKieProject.fetchKModule(ClasspathKieProject.java:148)
    at org.drools.compiler.kie.builder.impl.ClasspathKieProject.fetchKModule(ClasspathKieProject.java:109)
    at org.drools.compiler.kie.builder.impl.KieRepositoryImpl.getKieModule(KieRepositoryImpl.java:190)
    ... 2 more

提前致谢!

【问题讨论】:

    标签: java maven drools drools-guvnor kie


    【解决方案1】:

    我终于设法解决了这个问题。下面是一个工作示例,它通过 HTTP 从 KIE 存储库加载 Drools 工件并执行规则:

    package kieTest;
    
    import java.util.Scanner;
    
    import org.drools.compiler.kproject.ReleaseIdImpl;
    import org.kie.api.KieServices;
    import org.kie.api.builder.KieScanner;
    import org.kie.api.runtime.KieContainer;
    import org.kie.api.runtime.StatelessKieSession;
    
    public class MainKieTest {
    
        public static void main(String[] args) {
    
            // works even without -SNAPSHOT versions
            String url = "http://localhost:8080/kie-drools/maven2/de/test/Test/1.2.3/Test-1.2.3.jar";
    
            // make sure you use "LATEST" here!
            ReleaseIdImpl releaseId = new ReleaseIdImpl("de.test", "Test", "LATEST");
    
            KieServices ks = KieServices.Factory.get();
    
            ks.getResources().newUrlResource(url);
    
            KieContainer kieContainer = ks.newKieContainer(releaseId);
    
            // check every 5 seconds if there is a new version at the URL
            KieScanner kieScanner = ks.newKieScanner(kieContainer);
            kieScanner.start(5000L);
            // alternatively:
            // kieScanner.scanNow();
    
            Scanner scanner = new Scanner(System.in);
            while (true) {
                runRule(kieContainer);
                System.out.println("Press enter in order to run the test again....");
                scanner.nextLine();
            }
        }
    
        private static void runRule(KieContainer kieKontainer) {
            StatelessKieSession kSession = kieKontainer.newStatelessKieSession("testSession");
            kSession.setGlobal("out", System.out);
            kSession.execute("testRuleAgain");
        }
    }
    

    在搜索解决方案时,我发现以下链接很有帮助:

    我希望有人在将 SO 作为第一个搜索结果时发现这很有用 ;-)

    【讨论】:

    • 非常感谢!我还是不明白为什么 Drools 6 不再提供代理了。为使用 Drools 的应用程序使用 Maven 扫描器意味着 44 megs 的依赖关系 1)对客户端无用(例如 ant!) 2)增加了冲突的风险(例如 Guava) 我认为您的提议必须包含在类似 KnowledgeAgent 的行为中/ à la Drools 5.5.
    • 您知道在 Drools 项目/工件中是否可以使用您的解决方案将 EventProcessingMode 设置为 STREAM?我已经问过the question on SO,但我需要尽快得到答案。谢谢!
    【解决方案2】:

    这是步骤,所有步骤都是强制性的

    • 在你的 pom 中添加 kie-clie 依赖

      <dependency>
          <groupId>org.kie</groupId>
          <artifactId>kie-ci</artifactId>
          <version>6.2.0.Final</version>
      </dependency>
      
    • 将您的 KIE 工作台 maven 存储库添加到您的 pom.xml

      <repository>
          <id>guvnor-m2-repo</id>
          <name>Guvnor M2 Repo</name>
          <url>http://localhost:8080/drools/maven2wb/</url>
      </repository>
      
    • 将依赖项添加到您的pom.xml

      <dependency>
          <groupId>groupId</groupId>
          <artifactId>artifactId</artifactId>
          <version>LATEST</version>
      </dependency>
      
    • 在 settings.xml 中提供您的 repo 凭据

      <server>
          <id>guvnor-m2-repo</id>
          <username>admin</username>
          <password>@dmin</password>
      </server>
      
    • Java 代码

      KieServices ks = KieServices.Factory.get();
      ReleaseId releaseId = ks.newReleaseId("groupID", "artifactID", "LATEST");
      KieContainer kieContainer = ks.newKieContainer(releaseId);
      KieSession kieSession = kieContainer.newKieSession();
      kieSession.insert(object);
      kieSession.fireAllRules();
      

    【讨论】:

      【解决方案3】:

      上面的代码使用了 maven 和 kie-ci。您创建的 URLResource 未被使用。

      这是一个工作示例:

          String url = "http://localhost:8080/kie-drools-wb/maven2/groupId/artifactId/1.0/artifactId-1.0.jar";
      
          KieServices ks = KieServices.Factory.get();
          KieRepository kr = ks.getRepository();
          UrlResource urlResource = (UrlResource) ks.getResources()
                  .newUrlResource(url);
          urlResource.setUsername("admin");
          urlResource.setPassword("password");
          urlResource.setBasicAuthentication("enabled");
          InputStream is = urlResource.getInputStream();
          KieModule kModule = kr.addKieModule(ks.getResources()
                  .newInputStreamResource(is));
      
          KieContainer kContainer = ks.newKieContainer(kModule.getReleaseId());
      
          kContainer.newStatelessKieSession();
      

      请注意,您仍然需要稍作调整才能使其与 KieScanner 一起使用。

      【讨论】:

      • 如何导入UrlResource?我找不到这门课。
      • @jps KieScanner 可以使用上述方法吗?
      • 您知道在 Drools 项目/工件中是否可以使用您的解决方案将 EventProcessingMode 设置为 STREAM?我已经问过the question on SO,但我需要尽快得到答案。谢谢!
      猜你喜欢
      • 2020-11-08
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多