2

Drools drl ファイル内のいくつかの条件をテストしています。これらの条件のいずれかが true の場合、呼び出しプログラムにフラグを設定したいと考えています。

私は次の方法でこれをやってみました:

--- drl ファイル ----

//created on: 28 Aug, 2013
package flowManagers

import flowHelper.OrderRelatedQueriesFlowHelper;
import entity.Order;
import org.apache.log4j.Logger;

global Logger logger;
global Boolean isValid;

rule "isValid"
no-loop
salience -1
activation-group "AC1" 

when
        $o : Order( OrderRelatedQueriesFlowHelper.isValid($o))
then 
        isValid=Boolean.TRUE;
        logger.info("Valid order..." );
end

--- プログラム ビットの呼び出し ----

    Boolean isValid=Boolean.FALSE;
    String[] noHappyOrderFileList={"NoHappyOrder.drl"};
    StatefulKnowledgeSession ksession = createKnowledgeSession( noHappyOrderFileList );
    ksession.setGlobal("logger", logger);
    ksession.setGlobal( "isValid", isValid);
    for( Order fo : coll )
    {           
        ksession.insert(fo);
    }
    ksession.fireAllRules();

    logger.info("Valid?? : " + isValid );

しかし、ロガーが drl ファイル内に "Valid order..." を出力しても、呼び出し元のプログラムは依然として isValid を false として出力します。

誰かが私が間違っていることを教えてもらえますか?

ありがとうございました :)

4

1 に答える 1

2

Drools は、オブジェクトではなく「事実」で動作します。事実はオブジェクトですが、すべてのオブジェクトは事実ではありません。Boolean.TRUE が何を表しているか考えてみてください。

次に、次のコードについて考えます。

when
  $orderstatus : OrderStatus(...)
then
  modify ($orderstatus) {
     valid = Boolean.TRUE
  }

OrderStatus ファクトの有効性は 1 つのことしか意味しませんが、Boolean.TRUE はファクトとして使用するには広すぎる意味を持ちます。

于 2013-08-28T12:13:31.617 に答える