Drools规则错误“意外全局”

时间:2014-02-12 18:40:03

标签: jboss7.x drools business-rules

我在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

4 个答案:

答案 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()