Ein echter AFTER-Startup Microflow in Mendix?
Baut man eine Mendix Anwendung, so gibt es zahlreiche Dinge die man gerne beim Start der Anwendung ausführen würde. Initialisieren von Diensten, Starten der Process Queue, ein Update der MxModelReflection und viele weiter Aktionen werden daher gern innerhalb eines AfterStartup Microflows ausgeführt. Dies hat sicherlich viele Vorteile. Man kann sich sicher sein, dass diese Aktionen ausgeführt werden, man kann sicher sein, dass sie ausgeführt sind in dem Moment in dem die Anwendung verfügbar ist. und man kann den Start der Anwendung unterbinden wenn eine dieser Aktionen fehlschlägt.
Neben diesen offensichtlichen Vorteilen gibt es allerdings leider auch ein paar Nachteile.
- Der Mendix AfterStartup Microflow ist eigentlich ein DuringStartup Microflow, da er nicht nach, sondern während dem Start der Anwendung läuft.
- Führt man darin Aktionen aus die eine lange Laufzeit haben dauert der Start der Anwendung sehr lange. Bei besonders langen Aktionen kann es sogar passieren, dass die Anwendung aufgrund eines Timeouts überhaupt nicht startet.
- Der AfterStartup Microflow lässt sich nicht debuggen, da der Mendix debugger erst danach aktiv wird.
Wäre es nicht schön eine Möglichkeit zu haben ohne all diese Nachteile auszukommen? Ja. Und wenn man auf einige der Vorteile verzichtet ist dies sogar sehr einfach möglich.
Der AfterAfterStartup Microflow 🙂
Mit Hilfe eines einfach zu benutzenden AppStore Moduls ist es möglich einen Microflow zu haben, der erst anläuft, wenn der „echte“ AfterStartup Microflow abgeschlossen ist.
Man verzichtet hierbei auf die Möglichkeit den Anwendungsstart bei Problemen zu unterbrechen. Man sollte also darauf achten ein entsprechendes Error Handling in seinen Microflow integriert zu haben. Auch kann man nicht sicher sein, dass alle Aktionen abgeschlossen sind sobald die Anwendung verfügbar ist. In vielen Fällen ist das aber auch gar nicht notwendig. Der ProcessQueue ist es beispielsqweise egal ob sie erst ein paar Sekunden nach dem Anwendungsstart ihre Arbeit aufnimmt. Sie wird trotzdem alle Prozesse wie gewohnt abarbeiten.
Das benötigte AppStore Modul findet sich hier. Es enthält eine Java Action mit der es möglich ist innerhalb eines Microflows einen weiteren Microflow zu registrieren, der allerdings erst ausgeführt wird wenn die aufrufende Microflowkaskade abgeschlossen ist. Dieser „FollowUpMicroflow“ läuft dann in einem eigenen Systemkontext. Es gibt also keine Verbindung mehr zum Aufrufenden Microflow. Man kann sich außerdem sicher sein, dass die Transaktion des aufrufenden Microflows abgeschlossen ist. Etwaige Datenbank Änderungen haben also bereits stattgefunden.
Mit diesem Hilfsmittel ist es also möglich im normalen AfterStartup Microflow einen weiteren Microflow zu registrieren, der in einem eigenen Kontext läuft wenn der AfterStartup Microflow abgeschlossen ist. Ein unabhängiger AfterAfterStartup Microflow.
Das ganze sieht dann so in etwa aus:
Dieser AfterStartup Microflow terminiert sehr schnell und die Anwendung ist schnell verfügbar. Der registrierte AfterAfterStartup Microflow führt nun die ganzen rechenintensiven Aktionen aus.
Es ist selbstverständlich möglich eine Mischform zu wählen. So kann man beispielsweise Aktionen bei denen es möglich sein soll den Start der Anwednung zu unterbrechen im normalen AfterStartup ausführen und andere Aktionen in den AfterAfterStartup auslagern.
Der Debugger
Hält man sich strikt an die Anweisungen wird man feststellen dass ein Versprechen nicht gehalten wird. Der AfterAfterStartup Microflow lässt sich noch immer nicht debuggen. Der Debugger startet irgendwann nach dem AfterStartup Microflow, ist allerdings in der Regel noch nicht unmittelbar danach verfügbar. Will man seinen AfterAfterStartup Microflow trotzdem debugbar machen, kann man zu einem Trick greifen.
Lässt man den Microflow am Anfang erstmal 1-2 Sekunden warten (z.B. mit der hier gezeigten Delay funktion aus den CommunityCommons), so kann man den Debugger ab der folgenden Aktion (In diesem Fall Heavy Action 1) verwenden.
Viel Spaß beim Ausprobieren. Ich freue mich wie immer über euer Feedback.