Sagern subprocess out mapping fehlgeschlagen - was mache ich falsch?
-
19-09-2019 - |
Frage
Ich habe zwei "Hello World" -Prozesse erstellt, um den Subprozessknoten einen Wirbel zu geben. Ich habe Probleme, die Ausgabe vom Subprozess zurück zum Hauptprozess zu erhalten. Ich hoffe, jemand kann mich auf das, was ich falsch mache, aufklären kann, da ich keine Dokumentation oder Beispiele finden kann, die Licht darüber werfen, warum meine nicht funktioniert.
In meinem Hauptprozess habe ich Folgendes (beachten Sie, dass ich Header, Fußzeilen und die Position X, Y, Höhe, Breite, Breite Attribute) ausgeschnitten habe:
... 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...
Und hier ist das einfache subhello
Subprozess, der einfach die Eingabe nimmt und sie ausdruckt und dann die Eingangslänge erhält, um sie zurückzugeben:
... 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...
Dies gilt wie ich das DOC und die Beispiele interpretierte. Die erforderlichen Variablen werden sowohl im Hauptprozess als auch im Subprozess deklariert. Verwenden Sie dann einfach den Subprozess in/Out -Mapping -Elemente, um die aus und auf Attribute zu setzen.
Das Problem ist ... während name
wurde ohne Probleme in den Unterprozess übergeben und versuchte zu bekommen length
Zurück zum Hauptprozess ist fehlgeschlagen. Das length
im Subprozess wurde erfolgreich geändert. Aber beim Ausgang, length
Im Hauptprozess änderte sich nicht.
Was mache ich falsch? Zeiger und Erklärungen werden sehr geschätzt. Vielen Dank.
Lösung
Das Problem ist, dass Ihre Aktion die Längenvariable nicht ändert. Es ändert lediglich die lokale variable Länge innerhalb Ihrer Aktion. Um den Wert der Variablen zu ändern, verwenden Sie kcontext.setVariable ("Länge", name.length ());
Sie sollten auch die neueste Veröffentlichung von Drools 5.1 M1 aktualisieren, da dies ein Problem für ein Problem ohne Zuordnungen enthält, falls der Subprozess vollständig synchron ist (wie in Ihrem Beispiel der Fall).
Kris Verlaenen