2013-10-24 31 views
0

我是新來的口水和我想要做的就是從讀Drools的變量Java代碼

我使用的代碼從Drools的項目樣本是規則獲取值:

DRL文件:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
kbuilder.add(ResourceFactory.newClassPathResource("path.drl", getClass()), ResourceType.DRL); 
KnowledgeBuilderErrors errors = kbuilder.getErrors(); 

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

KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 
return kbase; 

插入對象和解僱規則

Bean bean = new Bean(); 
StatefulKnowledgeSession ksession = aKnowledgeBase.newStatefulKnowledgeSession(); 
// planning to insert a double 
ksession.insert(bean); 
ksession.fireAllRules(); 

我想要做的是從規則,我試過到目前爲止使用query這是我不知道如果是這樣做的正確方法得到的值:

global String $test; 

rule "Excellent" 

    when 
     // I'm planning to replace the bean with just a double is that possible? 
     $m: bean (listeningScore > 85) 
     $p: bean (listeningScore < 101) 
    then 
     $test = "Excellent"; 
     System.out.println($test); 

end 

query "Knowledge" 
    $result : $test 
end 

而且這產生了一個我真的不知道如何解決的錯誤。這裏是堆棧跟蹤:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
[24,0]: [ERR 102] Line 24:0 mismatched input 'end' in query 
[0,0]: Parser returned a null Package 
java.lang.IllegalArgumentException: Could not parse knowledge. 
    at com.neu.als.thesis.units.InferenceEngine.readKnowledgeBase(InferenceEngine.java:61) 
    at com.neu.als.thesis.units.EvaluationUnit.evaluateConceptKnowledgeLevel(EvaluationUnit.java:187) 
    at com.neu.als.thesis.web.controllers.FLTController.evaluateFLT(FLTController.java:108) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:946) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:848) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:822) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

回答

3

首先,該異常意味着DRL代碼將不會編譯。我懷疑這是因爲你的查詢引用了另一個規則的綁定變量,但它可能是別的。查看關於查詢語法的文檔。

但是,我傾向於使用兩種機制之一將規則響應獲取到Java代碼中。

  1. 在無狀態會話中有規則修改插入的事實。規則執行後,看看你插入的事實。
  2. 在有狀態會話中,您還可以使用session.getObjects()或session.getObjects(ObjectFilter)來獲取對規則執行後工作內存中的事實的引用。

這是第一個模式的一個例子,修改插入的事實:

rule "Reject a request" 
when 
    $req: PaymentValidationRequest() 
then 
    $req.setValid(false); 
    update($req); 
end 

PaymentValidationRequest request = new PaymentValidationRequest(payment); 
request.setPayment(payment); 
List<Object> facts = new ArrayList<Object>(); 
facts.add(request);  
ksession.execute(facts); 
... 
boolean isValid = request.isValid() 
List<ValidationAnnotation> annotations = request.getAnnotations(); 

這裏的第二模式的例子,當你的規則插入或修改事實:

ObjectFilter filter = new ObjectFilter() { 
     @Override 
     public boolean accept(Object object) { 
      return object.getClass().getSimpleName().equals("MyFact"); 
     } 
    }; 

    for (FactHandle handle : session.getFactHandles(filter)) { 
     Object fact = session.getObject(handle); 
     // Do something with the fact you just found in working memory. 
     // ... 
    } 
+0

我只做了一條規則。而且只有1個文件。你能給出你想說的話的片段嗎? – newbie