Открыть сервис

KieSession

KieSession — это центральный компонент платформы Drools (входит в состав проектов KIE — Knowledge Is Everything), предназначенный для выполнения бизнес-правил и обработки событий. KieSession представляет собой сессию (сеанс) работы с правилами, в которой происходит сопоставление фактов (данных) с условиями правил, активация и выполнение действий, заданных в правилах. Является основным интерфейсом для взаимодействия приложения с механизмом вывода (inference engine) Drools.

Архитектура и место в KIE

KieSession входит в состав KIE API — набора интерфейсов и классов, стандартизирующих работу с правилами, процессами и комплексными событиями (Complex Event Processing, CEP). Основные компоненты экосистемы KIE:

  • KieBaseбаза знаний, содержащая скомпилированные правила, типы фактов и функции. Является неизменяемым (immutable) объектом, создаётся из ресурсов (DRL-файлов, Excel-таблиц, десижн-тейблов).
  • KieSession — сессия, создаваемая из KieBase. В ней хранятся изменяемые данные (факты) и выполняются правила.
  • KieContainerконтейнер, управляющий версиями и артефактами (KJAR-файлами), из которых создаются KieBase и KieSession.

Типы KieSession

KieSession может быть создана в двух режимах, в зависимости от потребностей приложения:

StatelessKieSession (сессия без сохранения состояния)

  • Не сохраняет состояние между вызовами. Каждый вызов execute() обрабатывает переданные факты, выполняет правила и возвращает результат. Все факты после выполнения уничтожаются.
  • Используется для простых, однократных запросов: валидация данных, расчёт стоимости, проверка условий.
  • Потокобезопасна — может использоваться одновременно из нескольких потоков без синхронизации.
  • Создаётся методом KieBase.newStatelessKieSession().

StatefulKieSession (сессия с сохранением состояния)

  • Сохраняет факты между вызовами. Факты добавляются, изменяются и удаляются в течение жизни сессии. Правила могут срабатывать многократно при изменении данных.
  • Используется для длительных диалогов, мониторинга событий, комплексной обработки событий (CEP), игр и симуляций.
  • Не является потокобезопасной — для работы из нескольких потоков требуется синхронизация или создание отдельных сессий.
  • Создаётся методом KieBase.newKieSession().
  • После завершения работы должна быть вызвана dispose() для освобождения ресурсов.

Жизненный цикл сессии

  1. Создание — из KieBase вызывается метод newKieSession() или newStatelessKieSession().
  2. Вставка фактов — объекты (факты) добавляются в рабочую память сессии методом insert(fact). Факты могут быть любого Java-класса (POJO).
  3. Выполнение правил — вызов fireAllRules() запускает механизм вывода. Правила, чьи условия выполнены, активируются и выполняются. Возможно выполнение с ограничением по количеству срабатываний: fireAllRules(int max).
  4. Извлечение результатов — после выполнения правил можно получить изменённые факты, объекты, созданные правилами, или глобальные переменные (globals).
  5. Завершение — для StatefulKieSession обязателен вызов dispose(). Для StatelessKieSession вызов не требуется.

Основные методы и интерфейс

KieSession реализует интерфейс org.kie.api.runtime.KieSession (для stateful) и org.kie.api.runtime.StatelessKieSession (для stateless). Ключевые методы:

  • insert(Object fact) — добавляет факт в рабочую память, возвращает FactHandle (идентификатор факта).
  • update(FactHandle handle, Object fact) — уведомляет механизм вывода об изменении факта.
  • delete(FactHandle handle) — удаляет факт из рабочей памяти.
  • fireAllRules() — запускает выполнение всех активированных правил.
  • getObjects() — возвращает коллекцию фактов, находящихся в рабочей памяти.
  • setGlobal(String identifier, Object value) — устанавливает глобальную переменную, доступную правилам.
  • getGlobal(String identifier) — получает значение глобальной переменной.
  • addEventListener(AgendaEventListener listener) — позволяет подписаться на события срабатывания правил.

Пример использования (StatefulKieSession)

```java // Создание KieBase и KieSession KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieBase kieBase = kieContainer.getKieBase(); KieSession kieSession = kieBase.newKieSession();

// Вставка фактов Person person = new Person("Иван", 25); kieSession.insert(person);

// Установка глобальной переменной List<String> resultList = new ArrayList<>(); kieSession.setGlobal("resultList", resultList);

// Выполнение правил kieSession.fireAllRules();

// Завершение kieSession.dispose(); ```

Применение

KieSession используется в различных областях, где требуется декларативное программирование правил:

  • Бизнес-правилаавтоматизация принятия решений: кредитный скоринг, расчёт скидок, проверка соответствия нормативным требованиям.
  • Обработка комплексных событий (CEP) — выявление закономерностей в потоках событий: мониторинг мошенничества, управление цепочками поставок, анализ сетевого трафика.
  • Управление процессами — интеграция с jBPM (Java Business Process Management) для выполнения правил в рамках бизнес-процессов.
  • Игры и симуляции — реализация логики игровых правил, поведения NPC.
  • Валидация данных — проверка корректности вводимых данных на основе набора правил.

Производительность и оптимизация

  • Сеть Рете (Rete network) — KieSession использует алгоритм Rete (или его модификации ReteOO, PHREAK) для эффективного сопоставления фактов с условиями правил. При вставке факта сессия проверяет только те правила, чьи условия могут быть затронуты.
  • Активационные группы — позволяют управлять порядком выполнения правил, группируя их по приоритету.
  • Agenda Group — механизм для разделения правил на группы, которые выполняются последовательно или по условию.
  • Salienceатрибут правила, задающий приоритет (чем выше число, тем раньше правило срабатывает).
  • Ленивое выполнение — правила не проверяются постоянно, а только при вызове fireAllRules() или при изменении фактов.

Ограничения и особенности

  • KieSession не является сериализуемой в стандартном Java-смысле — для сохранения состояния между перезапусками приложения требуется использовать механизмы персистентности (например, базу данных).
  • Для StatelessKieSession не поддерживается длительное хранение фактов — все данные передаются в одном вызове.
  • При большом количестве правил и фактов (сотни тысяч) производительность может снижаться — требуется профилирование и оптимизация сети Рете.
  • В версиях Drools до 7.x использовался термин StatefulKnowledgeSession и StatelessKnowledgeSession — в современных версиях (7.x и выше) они заменены на KieSession и StatelessKieSession.

Источники

  • Drools Documentation — Red Hat, «KIE Session and Rule Execution»
  • «Drools: Business Rules Management System» — Mark Proctor, Michael Neale, et al.
  • Java API Specification for KieSession (org.kie.api.runtime.KieSession) — JBoss Community
  • «Mastering JBoss Drools 6» — Mauricio Salatino, Mariano De Maio, Esteban Aliverti

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →