代码之家  ›  专栏  ›  技术社区  ›  Jayram Kumar

找不到默认的KieSession

  •  3
  • Jayram Kumar  · 技术社区  · 7 年前

    我正在尝试使用KieModule创建jar。请看一下代码。

    public static ReleaseId createKJarWithMultipleResources(String id, String[] resourceFiles) throws IOException {
            KieServices ks = KieServices.Factory.get();
            KieModuleModel kproj = ks.newKieModuleModel();
            KieFileSystem kfs = ks.newKieFileSystem();
    
            for (int i = 0; i < resourceFiles.length; i++) {
    
                kfs.write("src/main/resources/" + id.replaceAll("\\.", "/")
                        + "/" + i + ".drl", resourceFiles[i]);
            }
    
            KieBaseModel kBase1 = kproj.newKieBaseModel(id)
                    .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
                    .setEventProcessingMode(EventProcessingOption.STREAM);
    
            KieSessionModel ksession1 = kBase1
                    .newKieSessionModel(id + ".KSession1")
                    .setType(KieSessionModel.KieSessionType.STATEFUL)
                    .setClockType(ClockTypeOption.get("pseudo"));
            kfs.writeKModuleXML(kproj.toXML());
    
            KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll();
            Results results = kieBuilder.getResults();
                if( results.hasMessages( org.kie.api.builder.Message.Level.ERROR ) ){
                    System.out.println( results.getMessages() );
                    throw new IllegalStateException( "### errors ###" );
                }
            KieModule kieModule = kieBuilder.getKieModule();
            return kieModule.getReleaseId();
        }
    

    但当我尝试使用以下代码使用jar时:

    KieContainer kieContainer =
    kieServices.newKieContainer(createKJarWithMultipleResources("1", 
    new String[] 
    {new String(Files.readAllBytes(Paths.get("path to drl file")))}
    ));
    KieSession kSession = kieContainer.newKieSession();
    

    我发现以下错误:

    java.lang.RuntimeException: Cannot find a default KieSession
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.findKieSessionModel(KieContainerImpl.java:628)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:621)
        at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:604)
        at com.sample.DroolsTest.test2(DroolsTest.java:87)
    

    我错过什么了吗?任何帮助都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jayram Kumar    7 年前

    问题解决了。我只需要更改代码中的以下行:

    KieSessionModel ksession1 = kBase1
                    .newKieSessionModel(id + ".KSession1")
                    .setType(KieSessionModel.KieSessionType.STATEFUL)
                    .setClockType(ClockTypeOption.get("pseudo"))
                    .setDefault(true);
    

    注意 setDefault(true) ,这在原始代码中不存在。

        2
  •  1
  •   Vadym Ozarynskyi    4 年前

    我创建了kmodule。src/main/resources/META-INF/folder中的xml,以及这样的连接网

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns="http://www.drools.org/xsd/kmodule"/>
    

    这对我很管用

    没有这个文件,它就失败了