繁体   English   中英

Web应用程序上的流口水

[英]Drools on web application

我对流口水很陌生,但是我想将其集成到我现有的项目中。 我正在使用Spring MVC框架。 我从流口水的免费项目中成功实现了一个简单的示例hello world。 我现在想做的是:

  1. 将bean发送到要评估的规则。
  2. 根据规则修改bean
  3. 将其发送回控制器以对用户做出响应。

步骤1我已经完成了。 我能够在规则中插入bean。 我现在的规则是这样的:

global String $test;

rule "Excellent"

    when
        $m: FLTBean ( listeningScore > 85 )
        $p: FLTBean ( listeningScore < 101 )
    then
        $test = "Excellent";
        System.out.println( $test );

end

对于步骤2步骤3,我不知道该怎么做。 如果可能的话,请给我一个简单的代码即可。 我想要嵌套规则。 以2个嵌套规则为例将是不错的选择。

提前致谢。

有两种方法可以执行此操作,具体取决于您使用的是无状态会话还是有状态会话。

rule "Excellent"
    no-loop
when
    $m: FLTBean ( listeningScore > 85 && listeningScore < 101 )
then
    $m.setRating("Excellent")
    update( $m )
end

在这种情况下,用于无状态会话的Java代码可能是:

FLTBean flt = new FLTBean(); 
flt.setScore(91);
List<Object> facts = new ArrayList<Object>();
facts.add(flt);
ksession.execute(facts);
System.out.println("Result is " + flt.getRating());

如果使用的是有状态会话,则可以插入事实,触发规则,然后从工作内存中查询事实。 您的规则可以像这样将新的事实插入工作记忆中:

rule "Excellent"
when
    $m: FLTBean ( listeningScore > 85 && listeningScore < 101 )
then
    insert( new FLTResult("Excellent") )
end

要再次获取结果,可以使用Drools API在工作内存中查找任何对象。

/** Provide a reference to the session and the class name 
 * of the fact you are searching for.
 */
public Collection<Object> findFacts(final StatefulKnowledgeSession session,
        final String factClass) {

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

    Collection<Object> results = session.getObjects(filter);
    return results;
}

// And call that like so:
FLTBean flt = new FLTBean(); 
flt.setScore(91);
ksession.insert(flt);
ksession.fireAllRules();
results = findFacts(ksession, "FLTResult");

一种选择是为bean编写查询,以便在执行规则后从规则引擎取回它。 如果您要提取很多豆,这可能会变得很麻烦。 文档向您显示了此方法的示例

另一个选择是拥有全局集合,在规则执行结束时您可以收集所有bean。 只需确保“收集”规则的显着性较低即可,使其最后执行。 该规则如下所示

rule 'collect results'
  salience -500
  when
    $beans : ArrayList() from collect( MyBean() )
  then
    someGlobal.setBeans( $beans);
end

实际上,您可以根据需要直接将其添加到全局列表中。 如果您不想要所有的bean,也可以在collect添加一些条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM