Сложная обработка событий Drools

Я хочу написать сложное правило, в котором мне нужно запускать правило, когда любой сетевой IP-адрес попадает в приложение в течение 10-минутного окна. у меня есть проблемы, когда IP-адреса будут меняться, и я не уверен, как отслеживать каждый IP-адрес, который попал в приложение.

rule "IP hit exceeds 10 times"
no-loop
when

    "some ip hitting more than 10 times"  over window:time(10m);

         $cnt: count(1); $cnt >= 10)
     then
        System.out.println("IP hit exceeds 10 times");

end

Мне нужна логика для этой части кода некоторые IP-адреса. Заранее спасибо.


person Manjunath Pai    schedule 05.12.2020    source источник


Ответы (1)


Если вы обратитесь к документации по Drools, вы увидите что функция accumulate, используемая в сочетании с window, сделает именно то, что вам нужно.

По сути, accumulate собирает элементы в коллекции — если бы мы не использовали скользящие окна, вы могли бы использовать это, чтобы получить подсписки или вычислить суммы по списку событий. Также есть похожая функция под названием collect, но в этом примере я буду использовать accumulate.

Во всяком случае, предположим, что у вас есть класс, определенный примерно так:

class IpHitEvent {
  private String ip;
  // getters and setters
}

Затем вы можете использовать accumulate вместе со встроенным методом count, чтобы получить количество попаданий IP для указанного IP.

rule "Single IP Hits > 10"
when
  $ip: String() // Target IP -- set based on your own logic
  Integer( this > 10 ) from accumulate(IpHitEvent( ip == $ip ) over window:time(10m), count(1))
then
  System.out.println($ip + " has hit more than 10 times!");
  // logic for when IP hit count exceeds 10
end
person Roddy of the Frozen Peas    schedule 16.12.2020