2009-10-02 11 views
0

J'ai créé deux processus "Hello World" pour donner un tourbillon aux nœuds subProcess. Je n'arrive pas à renvoyer la sortie du sous-processus vers le processus principal. J'espère que quelqu'un pourra m'éclairer sur ce que je fais de mal, car je ne trouve pas de documentation ou d'exemples qui expliquent pourquoi le mien ne fonctionne pas.Echec du mappage de sous-traitance de Drools - qu'est-ce que je fais de mal?

Dans mon processus principal, je donne les résultats suivants (notez que je l'ai en-têtes, pieds de page Snipped, et les x de position, y, hauteur, largeur des attributs):

 
... snip... 

<header> 
    <variables> 
    <variable name="name" > 
     <type name="org.drools.process.core.datatype.impl.type.StringDataType" /> 
     <value>World</value> 
    </variable> 
    <variable name="length" > 
     <type name="org.drools.process.core.datatype.impl.type.IntegerDataType" /> 
     <value>0</value> 
    </variable> 
    </variables> 
</header> 

... snip... 

<subProcess id="4" name="SubHello" 
      processId="subhello" waitForCompletion="true" > 
<mapping type="in" from="name" to="name" /> 
<mapping type="out" from="length" to="length" /> 
</subProcess> 

... snip... 

Et voici le subhello simple, le sous-processus, qui prend simplement l'entrée et il imprime, et obtient alors la longueur d'entrée pour revenir en arrière sur:

 
... snip... 

<header> 
    <variables> 
    <variable name="name" > 
     <type name="org.drools.process.core.datatype.impl.type.StringDataType" /> 
     <value></value> 
    </variable> 
    <variable name="length" > 
     <type name="org.drools.process.core.datatype.impl.type.IntegerDataType" /> 
     <value></value> 
    </variable> 
    </variables> 
</header> 

<nodes> 
    <start id="1" name="Start" /> 
    <end id="2" name="End" /> 
    <actionNode id="3" name="Action" > 
     <action type="expression" dialect="mvel" > 
System.out.println(name + ", " + length + ", in SubProcess, before"); 
length = name.length; 
System.out.println(length + ", in SubProcess, after"); 
     </action> 
    </actionNode> 
</nodes> 

... snip... 

C'est aussi par la façon dont je le doc et interprété des exemples. Les variables nécessaires sont déclarées à la fois sur le processus principal et sur le sous-processus, puis utilisez simplement les éléments de mappage in/out de subProcess pour définir les attributs from et to.

Le problème est .... tandis que name a été passé au sous-processus sans problème, essayant d'obtenir length de nouveau au processus principal a échoué. Le length dans le sous-processus a été modifié avec succès. Mais à la sortie, length dans le processus principal n'a pas changé.

Qu'est-ce que je fais mal? Les pointeurs et les explications sont très appréciés. Merci.

Répondre

2

Le problème est que votre action ne modifie pas la variable de longueur. Cela change simplement la longueur variable locale dans votre action. Pour changer la valeur de la variable, utilisez kcontext.setVariable ("length", name.length());

Vous devriez également mettre à jour la dernière version de Drools 5.1 M1, car cela inclut un correctif pour un problème avec les mappages au cas où le sous-processus est complètement synchrone (comme c'est le cas dans votre exemple).

Kris Verlaenen

+0

Merci pour la correction. Je voudrais juste noter que les docs doivent être plus clairs que je dois réellement appeler context.setVariable() dans un nœud d'action afin de définir la valeur d'une variable de processus. Le document Nœud Action ne mentionne pas que faire length = nom.length ne fait que définir une variable locale. Du document SubFlow, j'avais simplement supposé que la configuration de longueur = longueur aurait été suffisante. Mais merci encore! Je regarde dans le traitement d'événement suivant. – aberrant80