将Drools变量读取到Java代码中

将Drools变量读取到Java代码中,java,drools,Java,Drools,我不太会流口水,我想做的是从规则中得到一个值 Bean bean = new Bean(); StatefulKnowledgeSession ksession = aKnowledgeBase.newStatefulKnowledgeSession(); // planning to insert a double ksession.insert( bean ); ksession.fireAllRules(); 我使用了drools项目示例中的代码: 读取DRL文件: KnowledgeB

我不太会流口水,我想做的是从规则中得到一个值

Bean bean = new Bean();
StatefulKnowledgeSession ksession = aKnowledgeBase.newStatefulKnowledgeSession();
// planning to insert a double
ksession.insert( bean );
ksession.fireAllRules();
我使用了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

首先,该异常意味着DRL代码无法编译。我怀疑这是因为您的查询引用了另一个规则中的绑定变量,但它可能是其他的。查看有关查询语法的文档

然而,我倾向于使用两种机制之一来将规则响应引入Java代码

  • 在无状态会话中,让规则修改插入的事实。在规则执行之后,只需查看您插入的事实
  • 在有状态会话中,还可以使用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();
    

    首先,该异常意味着DRL代码无法编译。我怀疑这是因为您的查询引用了另一个规则中的绑定变量,但它可能是其他的。查看有关查询语法的文档

    然而,我倾向于使用两种机制之一来将规则响应引入Java代码

  • 在无状态会话中,让规则修改插入的事实。在规则执行之后,只需查看您插入的事实
  • 在有状态会话中,还可以使用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();
    

    首先,该异常意味着DRL代码无法编译。我怀疑这是因为您的查询引用了另一个规则中的绑定变量,但它可能是其他的。查看有关查询语法的文档

    然而,我倾向于使用两种机制之一来将规则响应引入Java代码

  • 在无状态会话中,让规则修改插入的事实。在规则执行之后,只需查看您插入的事实
  • 在有状态会话中,还可以使用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();
    

    首先,该异常意味着DRL代码无法编译。我怀疑这是因为您的查询引用了另一个规则中的绑定变量,但它可能是其他的。查看有关查询语法的文档

    然而,我倾向于使用两种机制之一来将规则响应引入Java代码

  • 在无状态会话中,让规则修改插入的事实。在规则执行之后,只需查看您插入的事实
  • 在有状态会话中,还可以使用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();
    

    我只制定了一条规则。只有一个文件。你能告诉我你想说什么吗?我只有一条规则。只有一个文件。你能告诉我你想说什么吗?我只有一条规则。只有一个文件。你能告诉我你想说什么吗?我只有一条规则。只有一个文件。你能说出你想说的话吗?