Глобальная переменная в сеансе Drools без сохранения состояния

Как глобальные переменные устанавливаются для сеанса слюни без сохранения состояния.

Допустим, два потока обращаются к одному и тому же сеансу, но задают массив массивов клиентов глобальной переменной с новым массивом массивов для каждого потока. Заменяет ли Arraylist второго потока список Arraylist первого потока для глобальной переменной customer.

Это похоже на случай из документации класса StatelessKnowledgeSession:

Сеансы StatelessKnowledgeSessions поддерживают глобальные объекты с разными областями видимости. Сначала я расскажу о некомандном способе, поскольку команды привязаны к конкретному вызову выполнения. Глобалы можно решить тремя способами. StatelessKnowledgeSession поддерживает getGlobals (), который возвращает экземпляр Globals. Эти глобальные объекты являются общими для ВСЕХ вызовов выполнения, поэтому будьте особенно осторожны с изменяемыми глобальными объектами в этих случаях - поскольку часто вызовы выполнения могут выполняться одновременно в разных потоках. Globals также поддерживает делегата, который добавляет второй способ разрешения глобальных переменных. Вызов setGlobal (String, Object) будет фактически установлен во внутренней коллекции, идентификаторы в этой внутренней коллекции будут иметь приоритет над предоставленным делегатом, если он добавлен. Если идентификатор не может быть найден во внутренней коллекции, он затем проверит глобальные объекты делегата, если таковой был установлен.

http://docs.jboss.org/jbpm/v5.1/javadocs/org/drools/runtime/StatelessKnowledgeSession.html

Я прав?


person pavanlapr    schedule 17.11.2012    source источник


Ответы (2)


Хотя я не могу дать вам полностью надежного ответа (потому что я не проверял это), я бы сказал, что вы правы, потому что

  1. под капотом StatelessKnowledgeSession Drools использует StatefulKnowledgeSession, и в сеансе с отслеживанием состояния я ожидал бы, что вызов setGlobal(...) переопределяет значение из предыдущего вызова.

  2. Глобалы хранятся в «магазине глобалов»; это хранилище глобальных переменных зависит от сеанса, что означает, что если вы добьетесь одновременного доступа к одному и тому же сеансу с использованием разных потоков, один поток переопределит хранилище глобальных переменных другого - в зависимости от того, какой поток setGlobal(...) выполняется последним.

person rowing-ghoul    schedule 13.03.2013

Я могу подтвердить - глобальные переменные хранятся в общей памяти между потоками.

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

person Alex    schedule 13.11.2018