Как правильно настроить cepheus cep для пересчета атрибута каждый час?

Позвольте мне объяснить это немного больше. У меня есть эта конфигурация cep:

{
  "host":"http://localhost:1028", //Cepheus CEP
  "in":[
    {
      "id":"A.*",
      "type":"Pevent",
      "isPattern":true,
      "providers":[
        "http://localhost:1027" //Cepheus Broker
      ],
      "attributes":[
         { "name":"idEvent", "type":"string" },
         { "name":"endDate", "type":"date" }
      ]
    }
  ],
  "out":[
    {
      "id":"A",
      "type":"Event",
      "brokers":[
        {
          "url":"http://localhost:1026" //orion
        }
      ],
      "attributes":[
         { "name":"expired", "type":"int" }
      ]
    }
  ],
  "statements":[
     "INSERT INTO Event SELECT idEvent as id, case when endDate<current_timestamp() then 1 else 0 end as expired FROM Pevent OUTPUT all"
  ]
}

Эта конфигурация, когда новый объект добавляется или изменяется в брокере контекста cepheus, он уведомляет cepheus cep, и cep вычисляет, истек ли срок действия объекта, и отправляет результат в orion. Это работает нормально, без проблем.

Теперь проблема в том, что мне нужно пересчитывать атрибут с истекшим сроком действия один раз в час (24 часа в сутки, 365 дней в году непрерывно), и я не знаю, возможно ли это в cep, потому что я не могу заставить его работать и не найти любую информацию.

Заранее большое спасибо.


person Mario Corral    schedule 26.05.2016    source источник


Ответы (1)


Вам нужно второе правило для обнаружения события с истекшим сроком действия.

Вы можете использовать Шаблоны Эспера, чтобы обнаружить что событие не происходило в течение определенного периода времени:

SELECT e.id as id, 1 as expired FROM pattern[every e=Pevent -> (timer:interval(1 hour) and not Pevent(id = e.id)]
person Marc    schedule 27.05.2016
comment
Извините, что отвечаю так поздно. Он работает идеально. большое спасибо. - person Mario Corral; 15.06.2016
comment
Что ж, поработав над другими вещами, я понимаю, что ваш ответ не удовлетворяет мои потребности, он делает это только через час или указанный интервал. Я пытаюсь сделать это SELECT e.id as id, 1 as expired FROM pattern[every timer:interval(1 hour) and e=Pevent -> (not Pevent(id = e.id)], и он работает так, как я хочу, но он застревает с первым событием только в таймере (консоль показывает только [Timer-default-0] с событием 1, даже если я отправил события 2 и 3). Как я могу сделать то же самое со всеми событиями? - person Mario Corral; 22.06.2016
comment
Что ж, возможно, вам следует отредактировать свой первоначальный запрос, добавив новое описание того, чего вы хотите достичь. Ответ, который я дал, должен был соответствовать вашему первоначальному запросу. - person Marc; 22.06.2016
comment
проблема та же, но это нужно делать 24 раза (1 раз в час) в день в течение 365 дней в году. Спасибо за помощь, надеюсь, что на этот раз я объяснил это лучше. - person Mario Corral; 23.06.2016
comment
Это может быть возможно с Esper, но, похоже, вам лучше работать с заданием cron, выполняющим запрос к базе данных. Вы можете добиться желаемого с помощью предложения on pattern и шаблона timer:at, но это кажется неправильным вариантом использования CEP. - person Marc; 23.06.2016