2008-09-22 2 views
2

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

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

ответ

2

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

+0

Я так думаю, что это правильный ответ. Используя jBPM, вы пишете «программу рабочего процесса» и должны решать свои собственные, уникальные проблемы, потому что никакая общая переменная синхронизации не может быть идеальной. – 2008-10-28 22:45:08

1

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

<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"/> 

В конце концов, я имел доступ к трем переменным, общий, справа и «fromRight», который был установлен с помощью сценария против родителя в явном виде.

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

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

+0

Поскольку это было выполнено в одном потоке (возможно?), То, что на самом деле произошло, было то, что изменения в левой вилке (запуск сначала) были перезаписаны изменениями, которые произошли в правой вилке. – Marco 2011-11-23 01:21:50

Смежные вопросы