Java-Spark-Drools : Exception in thread "main" java. lang.RuntimeException:找不到默认的 KieBase

标签 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>

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

最佳答案

在您的 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);

希望对你有帮助

关于Java-Spark-Drools : Exception in thread "main" java. lang.RuntimeException:找不到默认的 KieBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50870224/

相关文章:

apache-spark - 如何在本地映射 RDD?

java - 流口水如何进行日期计算?

java - JButton自定义问题

java - 泛型方法是否需要具有泛型类型参数才能正常工作?

java - 按计数查询dsl转换器组

java - Drools 中类型不安全的对象字段访问

java - 如何在没有 KIE-console 的情况下使用 JBPM 6.3 api 和 eclipse 部署 bpmn 文件?

Java和C#通过消息队列进行通信

scala - 将jar提交到sequenceiq docker-spark容器

apache-spark - 如何在 Spark MLlib 中为 K-means 初始化聚类中心?