2008-09-22 6 views
2

Lorsqu'un processus de jBPM se lance dans des chemins concurrents, chacun de ces chemins obtient sa propre copie des variables de processus, de sorte qu'elles s'exécutent isolées les unes des autres.jBPM, variables d'exécution et de processus simultanées

Mais que se passe-t-il lorsque les chemins se rejoignent? Évidemment, il pourrait y avoir des mises à jour contradictoires. Le contexte revient-il à l'état antérieur à la fourche? Puis-je choisir de copier des variables individuelles à partir des pistes séparées?

Répondre

2

Je pense que vous devez configurer les contrôleurs de tâches de vos tâches. Dans certains cas, il suffit de définir l'attribut access d'une manière qui n'entraîne pas de conflits (par exemple, read accès au premier chemin et read,write accès au deuxième chemin). Si ce n'est pas le cas, vous pouvez implémenter votre propre TaskControllerHandler et implémenter la méthode void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token) avec votre logique personnalisée. S'il vous plaît voir: Task Controllers.

+0

Je pense que cela est la bonne réponse. En utilisant jBPM, vous écrivez un "programme de workflow" et il doit résoudre ses propres problèmes, car aucune synchronisation générale des variables ne peut être parfaite. –

1

J'ai essayé une petite expérience:

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

A la fin, j'ai eu accès à trois variables, partagées, à droite et « fromRight » qui a été créé par le script contre le parent explicitement.

La variable partagée a pris sa valeur dans la fourchette de droite, les changements effectués sur la gauche semblaient disparaître.

Notez que les transitions ne sont pas réellement asynchrones pour moi, et toute l'expérience auront courir dans une transaction, ces facteurs peuvent influer sur le résultat

+0

Étant donné que cela a été exécuté dans un thread (probablement?), Ce qui s'est réellement passé était que les modifications apportées à la branche de gauche (exécution en premier), étaient remplacées par les modifications apportées dans la branche de droite. – Marco

Questions connexes