jBPM, параллельное выполнение и переменные процесса - PullRequest
2 голосов
/ 22 сентября 2008

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

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

Ответы [ 2 ]

2 голосов
/ 22 сентября 2008

Я думаю, что вы должны настроить контроллеры задач для ваших задач. В некоторых случаях достаточно установить атрибут access таким образом, чтобы это не приводило к конфликтам (например, read доступ к первому пути и read,write доступ ко второму пути). Если это не так, то вы можете реализовать свой собственный TaskControllerHandler и реализовать метод void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token) с вашей собственной логикой. Пожалуйста, смотрите: Контроллеры задач .

1 голос
/ 02 марта 2009

Я попробовал небольшой эксперимент:

<fork name="fork1" >
    <transition to="right" />
    <transition to="left" />    
</fork>

<node name="left">
    <event type="node-enter">
        <script>
            <expression >
                left="left";
                shared = left;
            </expression>
            <variable name='left' access='write' />
            <variable name='shared' access='write' />
        </script>
    </event>
    <transition to="join" />
</node>

<node name="right">
    <event type="node-enter">
        <script>
            <expression >
                right="right";
                token.parent.processInstance.contextInstance.setVariable("fromRight", "woot!");
                shared = right;
            </expression>
            <variable name='right' access='write' />
            <variable name='shared' access='write' />
        </script>
    </event>
    <transition to="join" />
</node>

<join name="join" >
    <transition to="done"></transition>
</join>

<end-state name="done"/>

В конце я получил доступ к трем переменным: shared, right и fromRight, которые были явно установлены сценарием для родительского элемента.

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

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

...