Это старая версия документа!


Подписка на события таймера и создание регулярного таймера

Статья в разработке!

Таймер, на который смотрит триггер, позволяет обрабатывать события типа «Если через X часов не произошло что-то, то делать предусмотренное действие». Т.е. можно проверить через некоторое время, выполнилось ли нужное условие, или нет.

Также иногда возникает потребности вызова общей логики, не привязанной к объектам системы, просто раз в некоторый интервал времени.

«Администрирование» → «Управление событиями таймера».

  • «Код операции» – числовой код операции
  • «Название операции» – из справочника бизнес операций, должна отображаться как гиперссылка на страницу редактирования / удаления соответствующей записи о таймере.
  • «Расписание» - сборно в виде строки, формата {Периодичность в днях / Если указана периодичность внутри дня, то указывается интервал внутри дня}. Например «Еженедельно, каждый пн, пт, каждую N неделю, в XX:YY», или «Периодически раз в 2:00».
    • Для аналога текстовое отображение интервалов уже реализовано в отправке форм (с периодичностью день и реже) и в настройке ОЛАП кубов (день и чаще).
  • «Последняя сработка» - Дата и время последней генерации соответствующего события, если оно наступало. Если событие еще не наступило, то пусто.
  • Должна выполняться сортировка по любой колонке (аналогично списку ОЛАП кубов).

При нажатии на «Добавить», должно отображаться окно

  • В окне должен быть обеспечен выбор бизнес операции в виде Код – Название, с поиском по вхождению фрагмента набираемого текста. Выбирается только одна бизнес операция.
  • Блок с расписанием комбинированный, при вариантах «Никогда», «Ежегодно», «Ежемесячно», «Еженедельно», «Ежедневно» - используется компонент из автоматической рассылки форм.
  • Добавить новый период «По интервалу», с периодичностью в часах, в том числе дробных. Аналогично пункту в расчете ОЛАП-кубов
    • При нажатии «Сохранить» - должна создаваться или изменяться открытая на редактирование запись.
    • При нажатии «Удалить» - должен появляться в браузерном окне запрос «Действительно удалить таймер для {Название операции}?» с кнопками «Ок» и «Отмена».

При вызове по ссылке «Справочник бизнес операций» из формы «Управление событиями таймера», должна открываться форма с таблицей:

  • «Код операции» - Уникальное числовое значение, при вставке заполняется автоматически, как максимум по значениям этого поля + 1. Передается вместе с событием в виде параметра.
  • «Название» - Текстовое название операции.
  • Блок кнопок «Редактировать / Удалить».
    • При нажатии на «редактировать», открывается окно редактирования названия операции.
    • При нажатии на «Удалить», отображается окно браузера с вопросом «Удалить операцию «Название операции»?
      Вместе с операцией будут удалена и все таймеры с ней связанные» с кнопками «Да», «Нет».
      • При нажатии «Да», операция удаляется, все таймеры (и по подписке, и по периодичности) для удаленной операции должны быть удалены из очереди.
      • При удалении, операцию удаления необходимо запротоколировать в системном протоколе в разделе настройки.

При нажатии на кнопку «+ Добавить», должно отображаться поле для ввода названия бизнес операции (как при редактировании), но изначально пустое. После заполнения пользователем и сохранения, операция должна быть сохранена, и ей присвоен новый код, рассчитанный как максимум по значениям поля «Код операции» + 1.

InsertTimerEvent, метод сохраняющий в очереди один вызов. Метод должен иметь параметры:

  • SessionID – ID сессии пользователя
  • CallTime – обязательный параметр типа DateTime в котором содержится дата и время, когда необходимо послать сообщение на шину.
  • ObjectID – GUID объекта, идентификатор, смысл которого будет известен при создании логики обработки, может быть идентификатором объекта дерева, записи справочника, пользователя и т.п. параметр не обязательный, если он не требуется, то вместо него должен допускаться null
  • OperationCode – обязательный целочисленный параметр с кодом операции. Код должен быть зарегистрирован в справочнике кодов операций, если его там нет, то ошибка «Код операции не зарегистрирован»
  • Parameters – объект типа JSON, в котором вызывающий может сохранить дополнительные параметры, которые будут необходимы при последующей обработке.
  • Метод не возвращает ничего если завершение успешно. Если не успешно, то вызывает исключение.

CheckTimerEvent, метод, проверяющий есть ли заданный вызов в очереди среди будущих и еще не сработавших элементов очереди. Метод должен иметь следующие параметры:

  • SessionID – ID сессии пользователя
  • OperationCode – обязательный целочисленный параметр с кодом операции
  • ObjectID – GUID объекта. Не обязательный параметр. Если он передан, ищутся сохраненные в очереди записи с точным совпадением на GUID и код операции. Если параметр null, то необходимо искать в очереди записи только с кодом операции и ObjectID = null.
  • Возвращать метод должен список, содержащий удовлетворяющие условию поиска элементы очереди с параметрами (CallTime, Parameters), в том числе может быть пустой список, если поиск успешен, если поиск не успешен, то вызывает исключение.

При наступлении времени, когда должно быть отправлено в шину событие, в зарегистрированных через метод InsertTimerEvent и не обработанных еще на момент наступления заданного времени, сгенерировать отправку в шину события типа «Подписка на таймер», с параметрами, сохраненными в нем при подписке:

  • OperationCode
  • ObjectID
  • Parameters

Отметить подписку, как исполненную (можно как время отправки, или ID события). Может потребоваться для последующих разборок нештатных ситуаций.

При наступлении времени, когда должно быть отправлено событие, согласно таблице настроек, должно быть отправлено в шину событие типа «Таймер», содержащее параметры:

OperationCode

Одновременно должно быть сохранено время последней сработки.