直接从存储库加载Drools / KIE Workbench工件

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

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

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

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

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

我的测试代码:

 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 

提前致谢!

我终于设法解决了这个问题。 下面是一个工作示例,它通过HTTP从KIE-repository加载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作为第一个搜索结果时发现这个有用;-)

上面的代码使用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一起使用。

以下是步骤,所有步骤都是强制性的

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

      org.kie kie-ci 6.2.0.Final  
  • 将您的KIE工作台maven repo添加到您的pom.xml

      guvnor-m2-repo Guvnor M2 Repo http://localhost:8080/drools/maven2wb/  
  • 将依赖项添加到pom.xml

      groupId artifactId LATEST  
  • 将您的repo凭据提供给settings.xml

      guvnor-m2-repo admin @dmin  
  • 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();