0

イベントを撤回するには、ルールのペアを作成する必要がありました。有効期限はないようです。私はワン・アンド・ダン・イベントを望んでいました。以下に示すように、デフォルトのデュレーションであるゼロを使用しています。

したがって、たとえば、撤回ルールを除外してから、最初に RemoveConnectionEvent を挿入し、次に CreateConnectionEvent を挿入すると、RemoveConnection ルールは引き続き実行されます。(単体テストで議題リスナーを使用する)

イベントに対する私の期待は、RemoveConnectionEvent が無視されることでした。その条件がすぐに満たされない場合は何もしません。NewConnection ルールが CreateConnectionEvent に応答したときにルール条件が満たされると、それがハングアップして RemoveConnection ルールをトリガーするとは思っていませんでした。

ルールを期待どおりに動作させるために、RetractedCreation、RetractedRemoval、および RetractedUpdate を作成しました。これはハックのようです。私は自分のイベントが間違っていると宣言したと想像しています。

何か案は?

ps これはかなり良い Q&A でしたが、私は Windows を使用していません。おそらく私のハックは「明示的な有効期限ポリシー」であると推測できます。

Drools Fusion CEP でのテスト イベントの有効期限

これが私のルールです。

package com.xxx
import com.xxx.ConnectedDevice
import com.xxx.RemoveConnectionEvent
import com.xxx.CreateConnectionEvent
import com.xxx.UpdateConnectionEvent

declare CreateConnectionEvent @role( event ) end
declare UpdateConnectionEvent @role( event ) end
declare RemoveConnectionEvent @role( event ) end

rule NewConnection
    when
        $connection : CreateConnectionEvent($newChannel : streamId)
        not ConnectedDevice( streamId == $newChannel )
    then
        insert( new ConnectedDevice($newChannel) );
end

rule RetractedCreation
    when
        $creationEvent : CreateConnectionEvent($newChannel : streamId)
        exists ConnectedDevice(streamId == $newChannel)
    then
        retract($creationEvent)
end

rule RemoveConnection
    when
        $remove : RemoveConnectionEvent($newChannel : streamId)
        $connection : ConnectedDevice( streamId == $newChannel )
    then
        retract( $connection );
end

rule RetractedRemoval
    when
        $removalEvent : RemoveConnectionEvent($newChannel : streamId)
        not ConnectedDevice(streamId == $newChannel)
    then
        retract($removalEvent)
end

rule UpdateConnection
    when
        $connectionUpdate : UpdateConnectionEvent($newChannel : streamId) 
        $connection : ConnectedDevice( streamId == $newChannel )
    then
    $connection.setLastMessage();
end

rule RetractedUpdate
    when
        $removalEvent : UpdateConnectionEvent($newChannel : streamId)
        not ConnectedDevice(streamId == $newChannel)
    then
        retract($removalEvent)
end
4

1 に答える 1

2

この自動期限切れは、かなりとらえどころのない機能です。いつ機能するか、機能させるために何をする必要があるかについての簡潔な定義はありません。

一時的な演算子を使用せず、イベントが 1 つのルールに一致した後に取り消されることを期待する単純なケースでは、「推定有効期限」と「管理されたライフサイクル」について別の考えを無駄にすることなく、次の戦略を採用します。

イベントに共通の (抽象) 基本クラスがあるとします。それ以外の場合は、マーカー インターフェイスを作成し、それをすべてのイベントにアタッチします。このタイプを と呼びましょうEvent。次に、単一のルール

rule "retract event"
salience -999999
when
    $e: Event()
then
    retract( $e );
end

すべての (作成、更新、削除) イベントを処理します。

編集イベントの有効期限に明示的な設定を使用することもできます。

declare CreateConnectionEvent
    @role( event )
    @expires(0ms)
end

必ず使用してください

KieBaseConfiguration config = ks.newKieBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );
KieBase kieBase = kieContainer.newKieBase( config );

KieBase を作成するとき。また、「時間を経過させる」ことをお勧めします。つまり、疑似クロックを進めるか、fireUntilHalt実際の挿入後、スレッドを 1、2 回実行させます。

于 2015-12-01T19:43:16.110 に答える