6

最後の発火から少なくとも 15 分経過するまで発火を遅らせるルールを書こうとしています。ただし、Drools Fusion のテンポラル オペレーターは、現在の時間に関連する 1 つのイベントではなく、相互に関連する 2 つのイベントについてのみ推論できます。

私はこのようなものが欲しいです:

rule "some rule"
when
    not LastFiredEvent(this before[0m, 15m] NOW)
    …

毎秒起動し、ハートビート イベントを挿入する (以前のハートビートも取り消す) ルールを作成することにしました。これを他のルールで使用して、現在の時刻として使用できます。

これはかなり洗練されていないと思います。何か足りないのでしょうか、それとも Drools Fusion にはこれに対する何かが本当にありませんか?

注意。ルールの遅延起動や、15 分の倍数でのみ起動できるルールを探しているわけではありません。過去 17 分間に何も起こらなかった場合、ルールは新しいイベントに応答してすぐに起動する必要があります。

4

1 に答える 1

8

「NOW」の概念は最初は単純に見えるかもしれませんが、あいまいであり、実行環境に基づいて取ることができるさまざまなセマンティクスに依存するため、そうではありません。Drools Fusionを STREAM モードで実行すると「NOW」という概念がありますが、上記で求めているものとは異なります。ここでの説明は少し長いので、問題に焦点を当てましょう。

最初に、「発火を遅らせるルールを書こうとしています...」と言い、次に「ルールの発火を遅らせようとしているわけではありません...」と言うので、何が必要なのか混乱します。

ルールを遅らせたい場合は、timer 属性を使用できます。

rule X
   timer( int: 15m )
...

ある間隔内でイベントが発生した場合、または発生しなかった場合にルールを起動する場合は、スライディング ウィンドウを使用できます。例えば:

rule "Event did not happen in the last 15m"
when
   not( SomeEvent() over time:window(15m) )
...

それが役立つことを願っています。ところで、Drools メーリング リストに質問を投稿すると、回答が得やすくなります。あなたの投稿を見たのは、友人が私に ping を送ったからです。

乾杯、エドソン

于 2011-01-17T08:20:49.013 に答える