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()для освобождения ресурсов.
Жизненный цикл сессии
- Создание — из KieBase вызывается метод
newKieSession()илиnewStatelessKieSession(). - Вставка фактов — объекты (факты) добавляются в рабочую память сессии методом
insert(fact). Факты могут быть любого Java-класса (POJO). - Выполнение правил — вызов
fireAllRules()запускает механизм вывода. Правила, чьи условия выполнены, активируются и выполняются. Возможно выполнение с ограничением по количеству срабатываний:fireAllRules(int max). - Извлечение результатов — после выполнения правил можно получить изменённые факты, объекты, созданные правилами, или глобальные переменные (globals).
- Завершение — для 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 →