Java-Spark-Drools:线程中的异常" main" java.lang.RuntimeException:找不到默认的KieBase

时间:2018-06-15 06:30:47

标签: java apache-spark drools kie

我有以下代码,它从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));

此处finalJoined的类型为Dataset<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>

有人可以提供rootcause和可能的解决方法吗?

1 个答案:

答案 0 :(得分:0)

kmodule.xml文件中,您定义了3个KieBases,其中包含3个不同的名称。到现在为止还挺好。现在,当您想从KieBase获得KieContainer时,您需要指定所需的KieBase名称。如果您未指定一个,Drools将在您的KieBase文件中查找默认kmodule.xml。如果您没有任何默认值KieBase,则Drools将因您遇到的例外而失败。

因此,您要么定义默认的KieBase<kbase name="rules" packages="rules" default="true">...

或者您指定了所需的KieBase... context.broadcast(kContainer.getKieBase("rules"), classTagTest);

希望它有所帮助,