Java-Spark-Drools:线程异常 "main" java.lang.RuntimeException:找不到默认的 KieBase
Java-Spark-Drools : Exception in thread "main" java.lang.RuntimeException: Cannot find a default KieBase
我有以下代码从 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)
它引起了问题,因为我必须将 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
。到目前为止,一切都很好。现在,当你想从 KieContainer
中得到一个 KieBase
时,你需要指定你想要的 KieBase
的名称。如果您不指定一个,Drools 将在您的 kmodule.xml
文件中查找默认值 KieBase
。如果您没有任何默认值 KieBase
,Drools 将因您遇到的异常而失败。
因此,要么定义默认值 KieBase
:<kbase name="rules" packages="rules" default="true">...
或者您指定 KieBase
您想要的内容:... context.broadcast(kContainer.getKieBase("rules"), classTagTest);
希望对您有所帮助,
我有以下代码从 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)
它引起了问题,因为我必须将 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
。到目前为止,一切都很好。现在,当你想从 KieContainer
中得到一个 KieBase
时,你需要指定你想要的 KieBase
的名称。如果您不指定一个,Drools 将在您的 kmodule.xml
文件中查找默认值 KieBase
。如果您没有任何默认值 KieBase
,Drools 将因您遇到的异常而失败。
因此,要么定义默认值 KieBase
:<kbase name="rules" packages="rules" default="true">...
或者您指定 KieBase
您想要的内容:... context.broadcast(kContainer.getKieBase("rules"), classTagTest);
希望对您有所帮助,