我在Drools中实现了业务规则,而执行时我得到java RuntimeException
Unexpected global [myService]
org.drools.common.AbstractWorkingMemory.setGlobal(AbstractWorkingMemory.java:588)
可能是什么原因?
规则:
rule "Tax Rule"
when
calculateTax : calculateTax(
objOne : objOne,
objTwo : objTwo,
objThree : objThree
);
objFour : objFour();
System.out.println("debug");
then
...
end
答案 0 :(得分:7)
要在DRL中声明和设置全局,您需要声明并初始化它:
// DRL file
global Service myService
// Java application
StatefulKnowledgeSession session = ...
session.setGlobal("myService", new Service() );
未能在DRL文件中声明全局或者全局名称与setGlobal调用中的第一个参数不匹配会导致错误消息显示为已发布。
答案 1 :(得分:1)
就是这样,对于5.x; 6.x有些不同:
KnowledgeBuilderConfiguration kbConfig =
KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
// kbConfig.setOption( sizeAccFunOption );
KnowledgeBuilder kBuilder =
KnowledgeBuilderFactory.newKnowledgeBuilder( kbConfig );
Resource drl = ResourceFactory.newFileResource( drlPath );
kBuilder.add( drl, ResourceType.DRL );
if( kBuilder.hasErrors() ){
System.err.println( "### compilation errors ###" );
KnowledgeBuilderErrors errors = kBuilder.getErrors();
for( KnowledgeBuilderError err: errors ){
System.err.println( err.toString() );
}
throw new IllegalStateException( "compile errors" );
}
答案 2 :(得分:0)
我发现了问题。我有几个System.out.println(),其中一个在下面显示的地方。删除它解决了问题。
rule "Tax Rule"
when
calculateTax : calculateTax(
objOne : objOne,
objTwo : objTwo,
objThree : objThree
);
objFour : objFour();
System.out.println("debug");
then
...
end
答案 3 :(得分:0)
在许多情况下,此错误表示您的DRL编译有错误,因此Drools会告诉您“意外的全局”,因为它在空的DRL中找不到任何全局声明。
DRL编译器不会对错误抛出任何异常,而是应使用以下命令自行检查:
kieBuilder.getErrors()