Я пытаюсь применить правило. Однако я получаю следующее исключение:
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
Спасибо