Wenn wir die Nachricht erst abschließen wollen, nachdem die Verarbeitung durchlaufen ist, gibt es zusätzlich noch die Möglichkeit mittels Peek-Lock Trigger, der die Nachricht empfängt und wir sie mittels zusätzlicher Action abschließen müssen.
Hier gibt es aber eine Limitierung, die dieses Vorhaben erschweren kann: eine Service Bus Nachricht kann maximal 5 Minuten lang für weitere Empfänger gesperrt sein. Heißt, wenn die Logic App länger als 5 Minuten läuft (so wie oben), wird die Nachricht wieder freigegeben und wird vom Trigger oder anderen Empfängern erneut verarbeitet.
Wir müssen die Sperrdauer der Nachricht also irgendwie erneuern können, wenn unsere Logic App nicht garantiert unter den 5 Minuten bleibt. Das soll möglichst effizient passieren und so lange, wie die Logic App für die Verarbeitung eben benötigt. Erfreulicherweise stellt uns der Logic App Designer hierzu eine Möglichkeit bereit.
Zu Beginn der Logic App wir eine Variable (isCompleted) initialisieren, die wir erst nach der Verarbeitung auf true setzen. Danach teilt sich unsere Logic App in zwei Zweige auf.
Der linke Zweig führt die Verarbeitung durch und schließt die Nachricht am Ende ab oder verwirft sie im Fehlerfall.
Der rechte Zweig, der parallel zum linken ausgeführt wird, erhält die Sperrzeit aufrecht, solange der verarbeitende Zweig noch nicht fertig ist.
Der While-Block stellt sicher, dass die Nachrichtensperre bis zu 1 Stunde gehalten wird. Um länger oder kürzer zu halten, kann der Timeout entsprechend angepasst werden.
Der Delay sollte kürzer sein als die Dauer der Nachrichtensperre. Da in diesem Beispiel die Sperre (Lock-Duration) 30 Sekunden beträgt, reichen hier 25 Sekunden aus. Die Dauer kann und sollte an die tatsächliche Sperrzeit angepasst werden.
Dadurch geben wir der Logic App die Zeit, die sie zur Verarbeitung benötigt und das ohne uns darüber Sorgen machen zu müssen, dass sie es in den vom Service Bus vorgeschriebenen 5 Minuten bewerkstelligen kann.
Dieser quiTeq-Tipp kam von Martin, QUIBIQ Stuttgart.