0

我对流口水很陌生,但我想将它集成到我现有的项目中。我正在使用 Spring MVC 框架。我从 drools 的免费项目中成功实现了简单的示例 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 个嵌套规则为例会很棒。

提前致谢。

4

2 回答 2

1

有几种方法可以做到这一点,具体取决于您使用的是无状态会话还是有状态会话。

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");
于 2013-11-09T14:12:26.983 回答
0

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

另一种选择可能是在规则执行结束时收集所有 bean 的全局收集。只需确保“收集”规则的显着性较低,以便最后执行。这条规则如下所示

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

事实上,如果需要,您可能可以直接添加到全局列表。collect如果您不想要所有 bean,您还可以添加一些条件。

于 2013-11-09T11:47:29.117 回答