0

私のdrlは次のとおりです。

rule "Active Orders"
    dialect "mvel"
    //no-loop
    when
        m: Order( status == Order.ENABLED, id : id )
    then
        System.out.println( "Order Id is: " + id );
        modify ( m ) 
        { 
            status = Order.DISABLED  
        };
end

次のように、単一の Order インスタンスを drools に渡します。

Order order = new Order();
order.setId(100);
order.setStatus( Order.ENABLED );
ksession.insert( order );

ksession.fireAllRules();

ルールが無限に起動され、次のメッセージが表示されます。

Order Id is: 100
Order Id is: 100
Order Id is: 100
.....

無限ループは理解できますが、重要なのは、変更ブロックで注文ステータスを無効に設定していることです:
status = Order.DISABLED

したがって、 when ルールが再び起動されます.... WHEN 条件、つまり status == Order.ENABLED は満たされるべきではなく、 system.out.println メッセージが複数回表示されることはありません。

私は何が間違っているのですか?
(注意: 私の問題は無限ループではありませんが、オブジェクトの変更後にルールが正しく評価されない理由)

4

1 に答える 1

0

変更ブロックの構文が間違っています (実際には、なぜコンパイルされるのか、何をしているのかわかりません)。これを試して:

modify(m){
    setStatus(Order.ENABLED);
}

それが役に立てば幸い、

于 2013-08-11T02:47:38.247 に答える