我有下面的代码,从Spark调用Drools规则引擎。

Spark版本:2.3.0

            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            ClassTag<KieBase> classTagTest = scala.reflect.ClassTag$.MODULE$.apply(KieBase.class);
            Broadcast<KieBase> broadcastRules = context.broadcast(kContainer.getKieBase(), classTagTest);
            finalJoined.foreach(row -> droolprocess(broadcastRules.value(),row));


这里finalJoinedDataset<Row>类型

public static void droolprocess(KieBase base,Row row){
        StatelessKieSession session = base.newStatelessKieSession();
                //some code to fire rules.
}


当我在Eclipse中运行此代码时,出现以下异常:

Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieBase
    at org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:336)
    at com.sample.Transformation.main(Transformation.java:66)


我的分析:

由于SparkContext的方法

public <T> Broadcast<T> broadcast(T value,
                                  scala.reflect.ClassTag<T> evidence$11)


引起问题是因为我必须将KieBase作为可序列化传递,并且它是在运行时生成的,所以问题来了。但是,我不确定这是否是正确的分析。

kmodule.xml

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
    <kbase name="dtables" packages="dtables">
        <ksession name="ksession-dtables"/>
    </kbase>
    <kbase name="process" packages="process">
        <ksession name="ksession-process"/>
    </kbase>
</kmodule>


有人可以提供根本原因和可能的方法来解决此问题吗?

最佳答案

在您的kmodule.xml文件中,您要定义3个具有3个不同名称的KieBases。到目前为止,一切都很好。现在,当您要从KieBase获取KieContainer时,需要指定所需的KieBase的名称。如果未指定,则Drools将在KieBase文件中查找默认的kmodule.xml。如果您没有默认的KieBase,Drools将失败,并显示您所拥有的异常。

因此,您可以定义默认的KieBase是什么:<kbase name="rules" packages="rules" default="true">...

或者您指定想要的KieBase... context.broadcast(kContainer.getKieBase("rules"), classTagTest);

希望能帮助到你,

关于java - Java-Spark-Drools:线程“main”中的异常java.lang.RuntimeException:无法找到默认的KieBase,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50870224/

10-10 22:50