当前位置: 首页 > 知识库问答 >
问题:

如何让Drools(Kie会话)在Netbean Web项目(No Maven)中运行?

费子濯
2023-03-14

几天来,我一直在尝试在Netbeans中运行Drools,但它就是不能像我希望的那样工作。我甚至试着让它作为一个maven项目工作,但效果不太好。我描述了我如何创建这个项目,希望有人能给我一个提示。

首先,我需要它在没有maven的情况下工作,因为我被限制不使用它。但在我把它放到真正的项目中之前,我想测试一下。

所以首先我创建了一个新项目

>

  • drools-compiler-6.4.0。最终的罐子
  • drools-core-6.4.0。最终的罐子
  • drools-decisiontables-6.4.0。最终的罐子
  • drools-jsr94-6.4.0。最终的罐子
  • drools-reteoo-6.4.0。最终的罐子
  • knowledge-api-6.4.0。最终的罐子
  • kie-api-6.4.0。最终的罐子
  • kie-internal-6.4.0。最终的罐子
  • kie-ci-6.4.0。最终的罐子
  • mvel2-2.2.6。最终的罐子
  • antlr-runtime-3.5。最终的罐子

通过这个设置,我创建了类(都在包中:Drools)DroolsMain(在没有Web服务器和gui的情况下进行测试,以便更快地调试)

public class DroolsMain {

    private static KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    private static Collection<KnowledgePackage> pkgs;
    private static KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    private static StatefulKnowledgeSession ksession;

    public static void main(final String[] args) {
        init();
        initMessageObject();
        fireRules();
    }

    private static void init() {
        String myRule = "import Drools.Message rule \"Hello World 2\" when message:Message (type==\"Test\") then System.out.println(\"Test, Drools!\"); end";       
        Resource myResource = ResourceFactory.newReaderResource((Reader) new StringReader(myRule));
        kbuilder.add(myResource, ResourceType.DRL);

        if(kbuilder.hasErrors()) {
            System.out.println(kbuilder.getErrors().toString());
            throw new RuntimeException("unable to compile dlr");
        }

        pkgs = kbuilder.getKnowledgePackages();

        kbase.addKnowledgePackages(pkgs);

        ksession = kbase.newStatefulKnowledgeSession();
    }

    private static void fireRules() {
        ksession.fireAllRules();
    }

    private static void initMessageObject() {
        Message msg = new Message();
        msg.setType("Test");
        ksession.insert(msg);
    }   
}

上面使用的消息类

public class Message {
    private String type;
    private String message;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }


}

我现在可以运行该代码并返回消息。

现在我想和Kie一起试试。。。

我只是对DroolsMain()方法中的方法进行了注释。并在当前Drools文档第172-174页中加入Kie方法:

private static void kieTest() {
        KieServices kieServices = KieServices.Factory.get();
        KieContainer kContainer = kieServices.getKieClasspathContainer();

        StatelessKieSession kSession = kContainer.newStatelessKieSession();
        Applicant bob = new Applicant("Mr. Bob", 16);
        //assertTrue(bob.isValid());
        kSession.execute(bob);
        //assertFalse(bob.isValid());            
    }

我没有把申请者放进去。类,因为它只是一个具有3个属性的bean。我还创建了DRL申请者。drl文件:

package Drools "Is of valid age"
import Drools.Applicant

when
    $a : Applicant(age < 18)
then
    $a.setValid(false);
end;

所以这显然不起作用,因为Kie有maven依赖项,所以我尝试了一下:1.添加目录:-DroolsTest/资源/-DroolsTest/资源/META-INF-DroolsTest/资源/META-INF/maven-DroolsTest/资源/Drools 2.创建DroolsTest/资源/META-INFkmodule.xml

内容:

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

创建DroolsTest/resources/META-INF/maven/pom。属性内容:(groupId我的包名),(artifactId我的项目名)

groupId=Drools artifactId=DroolsTest version=1

编译它会引发RuntimeException:

Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieSession
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.findKieSessionModel(KieContainerImpl.java:555)
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:548)
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:531)
    at Drools.DroolsMain.kieTest(DroolsMain.java:43)
    at Drools.DroolsMain.main(DroolsMain.java:52)
C:\Users\...\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 3 seconds)

有没有办法让Kiew在没有maven的情况下工作,或者我可以在没有maven的情况下读取文件?

更新:

我尝试了launes的解决方案:

import java.io.File;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Results;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class DroolsMain {
private void ntry() {
        KieServices kieServices = KieServices.Factory.get();
        KieFileSystem kfs = kieServices.newKieFileSystem();

        File rule = new File("src/main/resources/Drools/applicant.drl");
        Resource res = kieServices.getResources().newFileSystemResource(rule);
        kfs.write(res);
        KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
        Results results = kieBuilder.getResults();

        System.out.println("---Messages---");
        System.out.println(results.getMessages());

        KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
        KieBase kieBase = kieContainer.getKieBase();
        KieSession kieSession = kieBase.newKieSession();
    }

public static void main(final String[] args) {
        DroolsMain dm = new DroolsMain();
        dm.ntry();
    }
}

我还添加了drools发行版中的所有罐子。现在它可以编译并且没有错误

共有1个答案

易瀚漠
2023-03-14

我就是这样做的,没有maven,没有XML:

public void build() throws Exception {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kfs = kieServices.newKieFileSystem();
    //...
    Resource res = ...; 
    kfs.write( "src/main/resources/simple.drl", res );
    KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
    Results results = kieBuilder.getResults();
    if( results.hasMessages( Message.Level.ERROR ) ){
        System.out.println( results.getMessages() );
        throw new IllegalStateException( "### errors ###" );
    }

    KieContainer kieContainer =
        kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );

    KieBase kieBase = kieContainer.getKieBase();
    kieSession = kieBase.newKieSession();
}

我通常使用资源,例如

kieServices.getResources().newInputStreamResource( fis )

因为从文件中读取更灵活。

 类似资料:
  • “您可以决定创建多个会话...如果出于可伸缩性的原因需要多个会话。”

  • 到目前为止,我还不知道在Drools 6.0.0中向正在运行的Kie会话添加规则并仍然将我的事实保存在Kie会话中的最佳方法(意味着以最小的开销)。在Drools 5中,当KBase更改时,K会话会更新,但Drools 6似乎并非如此,因为我的规则不是在KieBase中创建的。有没有一种方法可以在不更换KieFileSystem中的整个KieModules或Jars的情况下做到这一点。我认为应该有

  • 我正在开发一个电子商务应用程序。为此,我想为每个客户创建一个会话,以维护他们的购物车信息。 如果它是一个普通的JavaEE项目,我会使用并将所有购物车信息添加到该会话中。 我的问题是对于EJB项目,为上述目的创建会话的过程是什么?

  • 我正在使用与Kie执行服务器集成的Drools workbench 7.17。我在workbench中创建了一个项目,该项目部署在kie执行服务器上。 我已经在项目的设置中配置了kie-base和kie-会话。将有状态的kie-会话定义为kieSession。我正在使用Kie ServerJavaClient API将事实插入引擎。 我能够在KieSession上进行查找。我将接收不同用户的数据,

  • 我是Spring Boot的新手,我的EclipseIDE中有Spring启动代码示例。 现在来运行这个项目。在项目中有一个“应用程序”类,我使用作为Java应用程序运行,然后它在给定的端口上运行。 但我希望它使用Eclipse的RunonServer选项运行,所以每当我尝试在服务器上运行它时,它都会给我404。 请给我任何想法来解决这个问题。 代码: 应用程序.属性 pom.xml 注意:当以J