java - Java-Spark-Drools:线程“main”中的异常 java.lang.RuntimeException:找不到默认的 KieBase
问题描述
我有下面的代码,它从 spark调用drools 规则引擎。
火花版本: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>
有人可以提供解决此问题的根本原因和可能的方法吗?
解决方案
在您的文件中,您使用 3 个不同的名称kmodule.xml
定义 3 。KieBases
到目前为止,一切都很好。现在,当您想从 中获取 aKieBase
时KieContainer
,您需要指定所需的名称KieBase
。KieBase
如果你没有指定,Drools 会在你的kmodule.xml
文件中寻找默认值。如果您没有任何 default KieBase
,Drools 将因您所拥有的异常而失败。
所以,要么你定义你的默认值KieBase
是什么:<kbase name="rules" packages="rules" default="true">...
或者你指定KieBase
你想要的:... context.broadcast(kContainer.getKieBase("rules"), classTagTest);
希望能帮助到你,
推荐阅读
- html - 单击按钮时引导模式不起作用
- react-native - 如何在 React Native (expo) 中更快地检测键盘状态?
- tableau-desktop - 如何在表格过滤器中添加前面具有 Action() 的字段
- excel - 将 sheetpathrange 字符串转换为范围的列表值
- java - 将一个列表复制到另一个列表而不丢失原始列表的运行时类型
- math - Tableau Round Function 无法识别 if 语句
- redis - 无法从 EdgeX Foundry 中的数据库加载存储和转发项目
- amazon-quicksight - 当数据处于不同的较小级别时,如何计算存储级别总和?
- html - CLS 问题:超过 0.25(移动)
- kentico - 使用 Kentico 进行视频竞赛和投票。可能吗?