リファレンス no-loop
no-loopは、そのルール自身を回帰的に連続して処理されないようにするときに宣言します。たとえば
package org.drools.test; import com.sample.Jumper; rule "ループ" when jumper : Jumper( ) #エンジンにassertされたファクトの型がJumperの場合、という条件 then System.out.println("in"); update( jumper ); end
このルールをfireすると無限にinを出力し続けます。なぜならupdateしてルールをぬけても、whenの条件が型指定してある以外何も指定してないので再度このルールがmatchしてしまうため。そんな時には「no-loop」です。
package org.drools.test; import com.sample.Jumper; rule "ループしないでぇ" no-loop true #これだけ!! when jumper : Jumper( ) then System.out.println("in"); update( jumper ); end
ちなみに指定しない場合はno-loop falseを指定していることと同意だ!注意しなきゃいけんのはそのルール自体が連続して回帰的に、というのがミソだ。この前に書いたjumperのhop-step-jumpする状態遷移で、hop-stepの後にまたhopに状態をupdateするとします。そうするとhop-stepを無限loopします。no-loop trueを入れてもダメです。理由はupdateするとそのルールを抜けて異なるルールがmatchするからです。(hop->step->hop->...という感じ)。無限loopとはいえちょっとしたルールを記述するだけで勝手にloopっちゃうので、ちっちゃな知能を感じます(大袈裟かなw)