java.lang.RuntimeException: неожиданная глобальная [карта] в Drools - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь применить правило. Однако я получаю следующее исключение:

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, и файл 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

Спасибо

...