Прослушивание и обработка событий
Этот раздел объясняет, как программным образом составить список событий контекста, подписаться на него и обработать.
Выяснение доступных событий
Существует несколько способов получения списка событий из Context
:
getEventDefinitions()
- этот метод вернет список всех событий в контекстеgetEventDefinitions(CallerController caller)
- этот метод вернет список событий, доступных вызывающемуgetEventDefinitions(String group)
- этот метод вернет список событий, принадлежащих определенной группе его подгруппgetEventDefinitions(CallerController caller, String group)
- этот метод вернет список событий, принадлежащих определенной группе и доступных вызывающему
|
Для извлечения одного определения события по его имени вызовите метод getEventDefinition(String name)
. Метод getEventDefinition(String name, CallerController caller)
вернет определение или ноль, если событие недоступно вызывающему.
Инициирование событий
Как только определенный компонент системы (например, драйвер устройства) определяет, что что-то произошло, он может инициировать событие контекста. Событие может быть запущено асинхронно из любого потока. Имейте в виду, что не существует общего способа удаленного запуска события (из SberMobile IIoT Platform Client или используя SberMobile Server API).
Для запуска события вызовите метод Context.fireEvent()
. Этот метод принимает следующие параметры:
- Имя события
- Уровень события
- Параметры события (в форме встроенной
DataTable
или списка значений ее ячеек)
Пример 1: запуск события путем подачи события DataTable
:
|
Пример 2: запуск события путем подачи значения ячейки таблицы событий:
|
Подписка на события
Модули сервера могут подписываться на события контекста, чтобы получать и обрабатывать их экземпляры. В большинстве случаев эта функциональность требуется при реализации настраиваемых плагинов сервера.
Чтобы подписаться на событие, нужно:
- Создать экземпляр класса, реализующего интерфейс
ContextEventListener
- Передать этот экземпляр методу
Context.addEventListener()
Интерфейс ContextEventListener
имеет множество методов, и в большинстве случаев разумнее наследовать слушателя вашего события из существующей реализации:
- При написании кода сервера (например, плагина) наследуйте слушателя вашего события из
ServerEventListener
для обеспечения правильного уровня прав доступа. - В других случаях используйте
DefaultContextEventListener
в качестве базы.
Использование |
Массовая подписка путем менеджера контекстов
Также возможно подписаться на события путем void addMaskEventListener(String mask, String event, ContextEventListener listener)
метода ContextManager
. У этого пути прдписки есть большое количество различий от подписки путем интерфейса Context
:
- Возможно получать события от различных ресурсов, указывая маску контекстов
- Если подписка была сделана путем
ContextManager
, определенный контекст был удален, a новый был создан с таким же именем, тот же самый слушатель будет автоматически добавлен в новый контекст
Слабые слушатели
У большинства методов подписки есть подписи, которые принимают флажок boolean weak
. Если определенный пользователь добавлен в качестве слабого, подписчик автоматически будет сборщиком мусора, если нет сильных ссылок на это.
Все слушатели по умолчанию не являются слабыми.
Обработка событий
Как только вы подписались на событие путем добавления слушателя, система будет вызывать метод слушателя handle()
каждый раз, когда происходит событие. Таким образом, вся логика обработки должна добавляться к реализации этого метода:
|
Получение доступа к историческим событиям
Существует два способа получить доступ к историческим событиям, хранящимся в базе данных сервера:
- Вызвать функцию получить из контекста события. Этот метод сработает как локально (внутри драйверов/плагинов сервера), так и удаленно (через сервер API).
- Вызвать метод Java
Server.getDaoFactory().getEventDao().getEvents()
. Этот способ чуть быстрее, чем предыдущий, но он работает только внутри сервера виртуальной машины Java (т.е. в драйверах/плагинах).
Вызов функции get
Функция get
контекста События возвращает таблицу данных, каждая строка которой содержит информацию об одном историческом событии. См. ее описание здесь.
|
Использование прямого доступа к базе данных
Метод класса EventDao
, выполняющий загрузку событий из базы данных, имеет следующую сигнатуру:
|
Этот метод принимает список типов событий для загрузки, предварительной фильтрации (additionalCriteria
) и постфильтрации (filter
), даты начала/окончания периода появления событий, максимальное количество событий для загрузки и опции сортировки. Параметры startDate
, endDate
и maxResults
могут быть цстановлны на null для отключения временного диапазона и ограничения количества.
Он возвращает список объектов Event
, представляющих хронологические события.
Пример использования:
|
Использование вспомогательных констант
Интерфейс, который находится в пакете com.tibbo.aggregate.common.server
, предоставляет константы строк, которые соединяются с большинством событий контекстов сервера и их полями.
Использование этих констант предпочтительнее, чем использование констант строк, определенных в вашем собственном коде. Это обеспечит безоткатные коды, если некоторые события или поля будут переименованы или перемещены в SberMobile Server в будущих версиях.