2016-09-07 11 views
1

以下のユースケースのルールを作成したいと思います。 2つの「AddToCart」イベントと「Search」イベントが、記述された順序で正確に想定されています。 P.P.これは実際のビジネスユースケースではありません。蓄積関数を使用したイベントの流れ

現在、私は以下のルールで解決策を達成しようとしている:

rule "Rule-102" 
salience 1000110000 
    agenda-group "level0" 
    dialect "mvel" 
    when 
     Number(doubleValue >= 2) from accumulate ($event1: Event(eval($event1.getName().equals('AddToCart'))),count($event1));$event: Event() 
     $event2: Event(eval($event2.getName().equals('Search')), this after $event) 
    then 
     sendEvent($event2, ed, drools); 
end 

イベントのシーケンスが適切に定義されていないため、このルールは正しくない動作します 検索 - > AddToShoppingCart - > AddToShoppingCart =アクション

私は、厳密な順序たい: AddToShoppingCart - あなたのルールが、この場合には(2 01パターンの小さなセットを伴う場合>検索=アクション

答えて

2

- > AddToShoppingCartをと1 Search)あなたはこのような何かを試みることができる:エレガントでありながら

rule "Rule-102" 
when 
    $e1: Event(name == "AddToCart") 
    $e2: Event(name == "AddToCart", timestamp > $e1.timestamp) 
    $s1: Event(name == "Search", timestamp > $e2.timestamp) 
then 
    sendEvent($s1, ed, drools); 
end 

は、このソリューションは、いくつかの潜在的な問題があります:

  • あなたはより多くのAddToCartイベントを使用したい場合には、うまくスケールしません。
  • あなたが3(またはそれ以上)AddToCartイベントをお持ちの場合は、一般的な多くのを使用したい場合は、このルールは、複数回(私はこれはあなたのユースケースで必要な動作であるかどうかわからないんだけど)

を発射します$イベント2イベント :

rule "Rule-102" 
when 
    $s1: Event(name == "Search") 
    Number(intValue >= 2) from accumulate(
     Event(name == "AddToCart", timestamp < $s1.timestamp), 
     count(1) 
    ) 
then 
    sendEvent($s1, ed, drools); 
end 

は$ EVENT1

+0

、それがお役に立てば幸いです:(evalの($ event1.getName()イコール( 'AddToCart'))。)のアプローチは、これらの線に沿って何かを試すことができます:イベント(eval($ event2.getName()。equals( 'AddToCart'))、これは$ event1の後) $ event3:イベント(eval($ event3.getName()。equals( 'Search'))、これは$ event2の後です) – DioNNiS

関連する問題