簡體   English   中英

如何在流口水中實現時間持久性?

[英]how to implement time persistence in drools?

我是流口水的新手,我想知道是否有一種方法可以編寫及時表達持久性的規則:

if (條件為真X 秒) then doSomething()

Rule "Example"
when
  r: Room(Temperature > 100 for 10 minutes )
then
  doSomething()
end

有兩種觸發 Drools 規則的模式——默認是“雲”模式,我們在一個時間點評估工作內存中的所有事實。 這是最古老和最常見的觸發規則的方式。 另一種模式是“流”模式,數據連續播放,Drools 引擎知道時間。

在流模式下,Drools 有一組時間運算符(鏈接到 Drools 文檔),可用於針對隨時間發生的事實編寫條件。

您可以在用例中使用時態運算符的一種方法如下:

rule "Detect temperature over 100 for 10 minutes"
when
  $t: Temperature(this >= 100) from entry-point "TemperatureStream"
  not(
    Temperature(
      this != $t, 
      this < 100,
      this after[0s,10m] $t) from entry-point "TemperatureStream")
then
  doSomething()
end

這個簡單的規則要求您通過某種外部機制從入口點 ( TemperatureStream ) 發送溫度事件。 當它檢測到超過 100 度的溫度(例如$t )時,第一個條件觸發。

第二個條件是魔法發生的地方。 第二個條件將只觸發,如果它在10分鍾內收到以下接收的小於100度的溫度事件$t

當您的監控應用程序發送溫度事件時,每個超過 100 的事件都會觸發第一個條件,然后開始監控流以查看第二個條件是否成立。 如果是這樣,規則的結果將被觸發。 否則規則匹配將被丟棄。

或者,您可以在 10 分鍾內使用滑動窗口查看最低溫度是否低於 100。

rule "Detect temperature over 100 for 10 minutes - sliding window"
when
  not(
    Number(doubleValue < 100) from accumulate(
      Room( $temperature: Temperature ) over window:time(10m),
      min( $temperature )
    )
  )
then
  doSomething()
end

此處, window:time(10m)是 10 分鍾內的滑動窗口。 與另一種解決方案不同,即使在每個事件進來時也對其進行觀察,然后嘗試檢查第二個條件是否匹配,這個解決方案只是查看一段時間內的所有事件。 如果整個窗口的最低溫度從未低於 100,則會觸發右側。

可能還有其他方法可以做到這一點,這只是我臨時想到的兩種方法。 該文檔特別適合 Drools 的這一部分,因此您可能會找到更適合您的用例的另一種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM