Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 直接从存储库加载Drools/KIE工作台工件_Java_Maven_Drools_Drools Guvnor_Kie - Fatal编程技术网

Java 直接从存储库加载Drools/KIE工作台工件

Java 直接从存储库加载Drools/KIE工作台工件,java,maven,drools,drools-guvnor,kie,Java,Maven,Drools,Drools Guvnor,Kie,我们尝试使用全新的KIE工作台(以前称为Guvnor)和新的基于maven的工件切换到Drools 6 现在,我想使用第二幅图(“部署”)中描述的系统:通过HTTP从工作台存储库加载规则(虚线箭头,从左侧的HTTP直接进入应用程序) 问题是,我不知道如何将工件加载到KieServices/KieModule对象中。我基本上不想使用maven,我也不能将maven的settings.xml全局路径作为Java参数提供,所以这个选项不可用 我认为类似的问题也存在。如前所述,我还尝试加载URL资源,但

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

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

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

我认为类似的问题也存在。如前所述,我还尝试加载URL资源,但问题似乎是系统无法确定给定URL(
http://localhost:8080/kie-drools/maven2/../-1.0.0.jar
)是。是的,我可以直接从浏览器从存储库访问.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

提前谢谢

我终于设法解决了这个问题。下面是一个通过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");
    }
}
在搜索解决方案时,我发现以下链接很有用:


我希望有人在获得第一个搜索结果时发现这一点很有用;-)

上面的代码使用maven和kie ci。未使用您创建的URL资源

以下是一个工作示例:

    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依赖项

    <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-ci</artifactId>
        <version>6.2.0.Final</version>
    </dependency>
    
  • 将依赖项添加到您的
    pom.xml

    <repository>
        <id>guvnor-m2-repo</id>
        <name>Guvnor M2 Repo</name>
        <url>http://localhost:8080/drools/maven2wb/</url>
    </repository>
    
    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>LATEST</version>
    </dependency>
    

非常感谢!我仍然不明白为什么Drools 6不再提供代理。在使用Drools的应用程序中使用Maven Scanner意味着44兆的依赖关系1)对客户端不可用(例如ant!)2)增加了冲突风险(例如Guava)我认为您的建议必须包含在知识代理(如Behavior/a la Drools 5.5)中。您知道在Drools项目/工件中,您的解决方案是否可以将
事件处理模式设置为
?我已经问过了,但我需要尽快得到答案。谢谢如何导入URL资源?我找不到此类。@jps可以使用上述方法吗?您知道在Drools项目/工件中是否可以将
EventProcessingMode
设置为
STREAM
?我已经问过了,但我需要尽快得到答案。谢谢
<server>
    <id>guvnor-m2-repo</id>
    <username>admin</username>
    <password>@dmin</password>
</server>
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();