Drools: сеанс проверки состояния без учета состояния

В чем разница между сессиями знаний без состояния и состояния. Я читаю некоторые документы, которые поддерживаются в состоянии. Но когда я могу использовать сеансы знаний без учета состояния/состояния.

Ответ 1

Stateless: Факт/рабочая память вставляется в сеанс базы знаний до запуска правил. Эти факты могут быть установлены путем вызова общедоступных методов для объекта при выполнении правил и после установки этих объектов возвращаются с измененными значениями.

Любые изменения в фактах при выполнении правил, например insert(xyz) или modify(xyz), не сообщаются механизму правил.

Stateful: Факт/рабочая память вставлена ​​в сеанс базы знаний до запуска правил и после того, как правила запущены, dispose() необходимо вызвать, чтобы избежать утечек памяти.

Любые изменения в фактах при выполнении правил, например insert(xyz) или modify(xyz), становятся доступными для механизма правил.

Ответ 2

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

В случае сеанса с состоянием он отслеживает рабочую память для изменений в  факты. Любые изменения в фактах приведут к фазе оценки  правил, которые должны быть повторены, что, в свою очередь, может привести к тому, что правило будет  запланировано для активации.
 В случае сессии без учета состояния он не отвечает на изменения фактов,
 после выполнения.

В случае сеанса с состоянием необходимо вызвать метод dispose()  когда вы закончите сеанс с состоянием, если вы не используете  RuntimeManager/RuntimeEngine, чтобы получить ваш KieSession.
  Безстоящий сеанс не требует вызова метода dispose().

В случае сеанса с состоянием он предоставляет множество методов для  двигатель "стрелять" (т.е. выполнять последствия правил  запланировано для активации).  fireAllRules()
 fireAllRules (фильтр AgendaFilter)
 fireAllRules (фильтр AgendaFilter, int max)
 fireAllRules (int max)
 fireUntilHalt()  fireUntilHalt (фильтр AgendaFilter)
 В случае сеанса без сохранения состояния двигатель запускается "с помощью" вызова через один  из  методы execute(). Эти два варианта; 1) передать один  объект/факт или 2) передать итерируемый объект, который содержит факт  которые будут использоваться.

В случае сеанса с состоянием, поскольку любые изменения в фактах доступны для  так что, если правило изменено для определенного факта, это  изменение будет активировать все правила и запустить правила, которые  основываться на измененном факте.
 В случае безстоящего сеанса любые изменения в  факты при выполнении правил не сообщаются механизму правил  поэтому, если какое-либо правило будет изменено, никакая другая повторная активация правил не будет  место.

Эти различия с примерами объясняются в этом Drools Stateful vs Stateless post

Ответ 3

Безстоящий означает, что для каждого запроса создается новый сеанс (так что состояние не поддерживается). Stateful означает, что он будет продолжаться из любого состояния, которое было в сеансе, когда закончилась предыдущая команда (например, все данные, которые были вставлены в сеанс, все еще будут там).

Ответ 4

Основное отличие, которым я его вижу, - это то, как сеанс автоматически устанавливается в апатриде. Нет никакого выигрыша в производительности, выбирая один против другого. Фактически, сеанс без состояния использует за собой сеанс с состоянием. Итак, иди цифрой!

Ответ 5

Вы можете найти полный пример разницы в ссылке ниже. Я понял это полностью, увидев это.

http://www.javainuse.com/drools_states

Ответ 6

1) В случае сеанса знаний без состояния, в то время как выполнение правил, то есть после вызова метода fireRules, модификация вставленных фактов (в той части) недоступна для механизма правил. В случае сеанса знаний о состоянии, любые изменения в фактах доступны для механизма правил.

2) После того, как правила запущены, объект Sessionful Knowledge Session должен вызвать метод dispose(), чтобы освободить сеанс и избежать утечек памяти.

3). В случае сеанса информирования о состоянии, любые изменения в фактах доступны для механизма правил. Таким образом, правила называются итеративно. Если Факт А изменен в последнем правиле DRL, то это изменение будет повторно активировать все правила и запустить правила, которые основаны на факте A. Это не относится к сеансу знаний без состояния.

Скрытый факт: сеанс без статусов использует за ним сеанс Stateful

Ответ 7

В сеансах с сохранением состояния мы можем изменять факты и вставлять их даже после того, как ранее были запущены правила.

В сеансах без сохранения состояния, после того как все правила были уволены (используя execute()), мы не можем дальше изменять факты и вставлять их в сеанс (так как сеанс неприменим после вызова execution()).

Ответ 8

Я хочу привести цитату из документации drools, которая очистила меня.

"StatelessKnowledgeSession предоставляет удобный API, обертывающий StatefulKnowledgeSession. Это позволяет избежать вызова dispose(). Сеансы без сохранения не поддерживают итеративные вызовы, действие call execute (...) - метод одиночного выстрела, который будет внутренне создать экземпляр StatefulKnowledgeSession, добавить все пользовательские данные и выполнять команды пользователя, вызывать fireAllRules, а затем вызывать dispose()."

В принципе, сеанс без состояния - сеанс с состоянием, используемый один раз.

Это означает, что сеанс без сохранения состояния также может делать вывод, в отличие от многих документов, и некоторые ответы здесь говорят! Это должно зависеть только от "тогда" части правила, используете ли вы "изменение" или нет.

Пока я не проверял это сам, этот пост, похоже, поддерживает мои рассуждения.

https://groups.google.com/forum/#!topic/drools-usage/qYbqiS1ht4g