java.lang.RuntimeException:Drools中出现意外的全局[map]

时间:2018-07-04 14:09:08

标签: java global drools

我正在尝试开除规则。但是,我收到以下异常:

java.lang.RuntimeException: Unexpected global [map]
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.setGlobal(StatefulKnowledgeSessionImpl.java:1163)
    at com.senselytics.inference.rule.RulesEngineStreamMode.init(RulesEngineStreamMode.java:72)
    at com.senselytics.inference.rule.RulesEngineStreamMode.<init>(RulesEngineStreamMode.java:34)
    at com.senselytics.inference.mq.MessageReceiverHandler.<init>(MessageReceiverHandler.java:15)
    at com.senselytics.inference.mq.MessageReceiverHandler.getInstance(MessageReceiverHandler.java:22)
    at com.senselytics.RulesEngineTest.testThreshhold(RulesEngineTest.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at junit.framework.TestCase.runTest(TestCase.java:176)
    at junit.framework.TestCase.runBare(TestCase.java:141)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:252)
    at junit.framework.TestSuite.run(TestSuite.java:247)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

代码:

System.setProperty("drools.dialect.java.strict", "false");
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                .newKnowledgeBuilder();
        Map<String, TagEvent> map = RulesEngineDAO.selectAllConfigDetails();
        for (TagEvent tagEvent : map.values()) {
            kbuilder.add(ResourceFactory.newReaderResource(TagEventRuleBuilder
                    .buildRuleFromTemplate(tagEvent)), ResourceType.DRL);
        }
        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
        KieBaseConfiguration kbaseConfiguration = KnowledgeBaseFactory
                .newKnowledgeBaseConfiguration();
        kbaseConfiguration.setOption(EventProcessingOption.STREAM);
        final KnowledgeBase kbase = KnowledgeBaseFactory
                .newKnowledgeBase(kbaseConfiguration);
        kbase.addKnowledgePackages(pkgs);
        KieSessionConfiguration sessionConf = KnowledgeBaseFactory
                .newKnowledgeSessionConfiguration();
        sessionConf.setOption(ClockTypeOption.get("realtime"));
        ksession = kbase.newStatefulKnowledgeSession(sessionConf, null);
        Map<String, TagEvent> globalMap = RulesEngineDAO.selectAllConfigDetails();
        ksession.setGlobal("map", globalMap);
        new Thread() {
            @Override
            public void run() {
                ksession.fireUntilHalt();
            }
        }.start();

我正在调用上面的代码进行会话。一切都很好,并且能够参加知识会议。但是,就行

ksession.setGlobal("map", globalMap);

,抛出以上异常。

正在使用模板生成DRL文件的Am也正在生成DRL文件。在模板和生成的DRL文件中:

global java.util.Map<String,TagEvent> map;

我真的无法弄清楚为什么在运行代码时会出现此错误。

使用以下代码段:

KnowledgeBuilderErrors errors = kbuilder.getErrors();

        if( errors.size() > 0 )
        {
             for( KnowledgeBuilderError error : errors )
             {
                  System.err.println( "Errors : "+error );
             }
             throw new IllegalArgumentException( "Could not parse knowledge." );
        }

现在我遇到以下错误:

Errors : [46,4]: [ERR 102] Line 46:4 mismatched input 'then' in rule "Count Values"
Errors : [0,0]: Parser returned a null Package
Errors : Unable to process type TagEventMetadata
Errors : Unable to process type TagEventTimeTracker
Errors : Unable to process type TagEvent
Errors : Unable to process type TagEventMetadata
Errors : Unable to process type TagEventTimeTracker
Errors : Unable to process type TagEvent
Errors : Unable to process type TagEventMetadata
Errors : Unable to process type TagEventTimeTracker
Errors : Unable to process type TagEvent
Errors : Unable to process type TagEventMetadata
Errors : Unable to process type TagEventTimeTracker
Errors : Unable to process type TagEvent
Errors : [46,4]: [ERR 102] Line 46:4 mismatched input 'then' in rule "Count Values"
Errors : [0,0]: Parser returned a null Package
Errors : Unable to process type TagEventMetadata
Errors : Unable to process type TagEventTimeTracker
Errors : Unable to process type TagEvent

DRL:

package com.senselytics.inference.rule.counter;
import java.util.HashMap;
import com.senselytics.inference.rule.*;
import com.senselytics.inference.vo.*;
import com.senselytics.inference.vo.TagEvent;
import com.senselytics.inference.vo.TagEventTimeTracker;
import com.senselytics.inference.vo.TagEventMetadata;
global java.util.Map<String,TagEvent> map;
declare TagEvent
    @role( event )
    @timestamp( tagTime )
    @expires( 1s )
end 
declare TagEventMetadata
    @role( event )
end
declare TagEventTimeTracker
    @role( event )
end
rule "Out Of Range Check -LOW"
    dialect "java"
    when
        $tagEvent : TagEvent( status==Status.WITHIN_RANGE, tagValue != null,map.get($tagEvent.getTagName())!=null, tagValue<=((TagEvent)map.get($tagEvent.getTagName())).getMinThreshold()) 
    then
        System.out.println("Out Of Range Check -LOW");  
        modify( $tagEvent ) { setStatus( Status.OUT_OF_RANGE_LOW  ) };
end;
rule "Out Of Range Check - HIGH"
    dialect "java"
    when
        $tagEvent : TagEvent(  status==Status.WITHIN_RANGE, tagValue != null, map.get($tagEvent.getTagName())!=null, tagValue >= ((TagEvent)map.get($tagEvent.getTagName())).getMaxThreshold() )        
    then
        System.out.println("Out Of Range Check - HIGH");
        modify( $tagEvent ) { setStatus( Status.OUT_OF_RANGE_HIGH  ) };
end;
rule "Trigger Threshold Alert" 
    dialect "java"
   when
       $tagEvent : TagEvent( status!=null, status!=Status.WITHIN_RANGE )        
   then
       FileWriter.writer("Out Of Range Check : "+$tagEvent);
end;

rule "Count Values"
    dialect "java"
    when
         accumulate ( TagEvent( tagName.equals("GSA_SI11151"), status!=Status.WITHIN_RANGE  ) 

    then       
           FileWriter.writer("Counter Threshold Reached : " + $cnt ) ; 
end

谢谢

0 个答案:

没有答案