Получение уведомления о событиях логического отвода Drools - PullRequest
1 голос
/ 10 августа 2010

У меня есть база знаний для выполнения проверки моей модели данных. События модификации из пользовательского интерфейса асинхронно публикуются в отдельном потоке, который обновляет базу знаний и запускает правила. Ошибки проверки запускают логическую вставку объекта ошибки. Я могу собирать их и публиковать события асинхронно обратно в поток пользовательского интерфейса. Однако, чтобы упростить поддержание актуальности пользовательского интерфейса, я также хочу опубликовать событие, когда пользователь исправляет ошибку, т.е. когда объект ошибки извлекается из базы знаний.

У меня есть две идеи, как это сделать, ни одна из которых мне не нравится:
Я мог прослушивать события рабочей памяти из процедурного кода, но это нарушало бы инкапсуляцию функциональности проверки в базе знаний.

Кроме того, я мог бы вставить объект-флаг в паре с моей логической вставкой объекта ошибки и написать правило, которое обнаруживает непарные флаги, убирает их и запускает событие «ошибка исправлена».

Существует ли простой и понятный способ активировать правило, основанное на логическом возврате объекта ошибки, как описано выше?

1 Ответ

1 голос
/ 22 июня 2011

Автоответчик, чтобы я мог связаться с этим позже и выяснить, есть ли лучший способ сделать это.

Вот подход, который я выбрал:

  1. Когда запускается правило проверки, insertLogical объект с уникальным идентификатором, представляющим ошибку проверки (например, ValidationMessage).

  2. ValidationMessage имеет свойство «помечено», которое по умолчанию имеет значение false.

  3. Определить правило, которое срабатывает при наличии неотмеченных сообщений ValidationMessages. В RHS пометьте сообщение и выполните вызов onAssert для глобального обработчика событий. Вставьте второй объект (например, ValidationMessageFlag) с тем же идентификатором, что и ValidationMessage.

  4. Определить правило, которое срабатывает при существовании ValidationMessageFlag, когда не существует соответствующего ValidationMessage (с таким же идентификатором). В RHS вызовите onRetract в глобальном обработчике событий. Уберите ValidationMessageFlag.

...