1.1 Problem / Fragestellung
Wollen wir nun eine Variable in einer foreach-Schleife updaten und verwenden, kann das problematisch werden: Zum einen sind die Variablen nicht im Kontext der Schleife, sondern global. Zum anderen laufen die foreach-Schleifen parallel in 20 Threads, falls nicht anders konfiguriert. Durch diese globalen Variablen und der Parallelität der Schleife sind die Werte nicht im Scope der Iteration, wodurch häufig Werte einer parallelen Iteration verarbeitet werden.
1.2 Lösungsansatz
Es gibt mehrere Lösungsansätze für dieses Problem, alle mit Vor- und Nachteilen. Nachfolgend werden vier Möglichkeiten aufgezeigt.
1.2.1 Synchroner foreach
Die einfachste Lösung ist es, die foreach-Schleife synchron laufen zu lassen. Hierfür findet man in der Schleife unter dem Tab "Settings" "Concurrency Control". Dieser Wert wird aktiviert und der Regler nach 1 verschoben. Der Nachteil ist jedoch die Geschwindigkeit des Runs: Sollten vielen Datensätzen in der Schleife verarbeitet werden, dauert dies nun massiv länger, als parallel, weshalb sich diese Möglichkeit nur dann eignet, wenn eine begrenzte Anzahl Daten verarbeitet werden muss oder die Performance nicht allzu wichtig ist.
Abbildung 1: Synchrone Schleife
1.2.2 Compose
Anstelle einer Variable, kann alternativ auch eine Compose Action innerhalb der Schleife verwendet werden. Diese wird nur im Scope der einzelnen foreach-Iteration initialisiert. Sollte jedoch eine Condition mit Logik zum Setzen des Wertes in der Schleife verwendet werden, funktioniert dieser Ansatz wiederum nicht.
Abbildung 2: Compose
1.2.3 Ausbau in eigenen Workflow
Eine weitere Möglichkeit ist der Ausbau der gesamten Schleifen-Logik in einen eigenen Workflow. Es können die Werte dann in der Schleife via "Invoke process"-Action übergeben werden. Variablen, welche dann in diesem eigenen Schleifen-Workflow initialisiert und upgedatet werden, gelten jetzt auch nur im eigenen Run und deshalb in der einzelnen Iteration. Diese Lösung hat, technisch gesehen, keine Nachteile. Es kann aber viel Aufwand bedeuten, die gesamten Logik auszubauen. Außerdem müssen beim Monitoren nun statt einem, zwei Workflows überprüft werden.
Abbildung 3: Aufruf Workflow
1.2.4 Inline Expressions
Diese Lösung eignet sich vor allem für den Fall, dass die Variablen mithilfe einer Condition in der Schleife updated werden. Anstelle einer Condition und dem Setzen der Variable, kann dies direkt in der Action, welche den Wert benötigt, via Inline Expression gemacht werden.
Der größte Nachteil hier ist die Übersichtlichkeit des Workflows. Vor allem beim Monitoring eines Runs, anstelle einer klaren Condition, mit sichtbarem Resultat, versteckt sich das Resultat der Condition jetzt in einem Feld.
Mit der ursprünglichen Condition ist der Aufbau klar verständlich:
Abbildung 4: Condition
Die folgende Expression wird in einer Action gesetzt, in welcher ursprünglich die Variable verwendet wurde. Die Überprüfung ist dabei identisch der vorigen Condition. Somit werden die Werte direkt im Feld der Action gesetzt. Die Übersicht des Workflows leidet aber durch die Inline Expression, was das Monitoren erschweren kann.
1.3 Fazit
An sich sind alle Lösungen valide. Es muss jedoch überprüft werden, wie viele Datensätze verarbeitet werden, ob eine Condition in der Schleife ausgeführt werden muss, wie wichtig die Performance ist und wie viel Logik sich innerhalb der Schleife befindet. Auch das zukünftige Monitoring der Logic App muss berücksichtigt werden.
Dies ist ein Beitrag von Patrick Hettich, Lead Developer D5, QUIBIQ Schweiz AG