Synchron oder Asynchron? Dynamic Actions in Application Express 5.1.
Erscheinungsmonat |
APEX-Version |
Datenbankversion |
Cloud oder on Premise |
Dezember 2016 |
5.1 |
ab 11.2 |
beides |
Seit dem 16. Dezember 2016 ist APEX 5.1 auf dem öffentlichen Demoserver apex.oracle.com verfügbar. Damit steht dem Testen der neuen Funktionen nichts mehr im Wege - und natürlich werden sich die Community-Tipps im Jahr 2017 intensiv mit diesen neuen Funktionen beschäftigen.
- Oft wurde nach dem "editierbaren interactive Report" gefagt - mit dem neuen Interactive Grid ist dies
nun Realität.
- Die Integration von Oracle JET bringt viele neue Diagrammtypen - out of the box.
- Das Universal Theme wurde erweitert und nochmals verbessert. Vor allem die neue Icon Bibliothek Font APEX ist erwähnenswert.
- Darüber hinaus bringt das neue Release zahlreiche neue Funktionen im Detail - wie die Möglichkeit, ein Icon für ein Formularelement oder für die Applikation selbst festzulegen. Eine Aufzählung würde hier zu weit führen; die vollständige Liste findet sich in den Release Notes in der Dokumentation.
Besonders erwähnenswert sind die Packaged Applications, die mit der Version 5.1 wiederum erweitert
wurden. So gibt es die Beispielanwendung Sample Interactive Grids, welche
verschiedenste Anwendungsvarianten des Interactive Grid zeigt - wer also wissen möchte, wie
diese neue Komponente in eigenen Anwendungen verwendet werden kann, ist dort genau richtig. Aber
auch andere Beispielanwendungen wurden aktualisiert: So zeigen
Universal Theme Sample Application und
Sample Calendar Anwendung, dass sich auch bei diesen Komponenten eine Menge getan hat. Und das
sind nur drei der 40 im Release 5.1 mitgelieferten Anwendungen.
Packaged Application "Sample Calendar"
In diesem Community Tipp geht es jedoch nicht um die neuen Features, sondern um etwas, was
sich mit Application Express 5.1 auch für bestehende Anwendungen ändert:
asynchrone Dynamic Actions. Dieser Tipp erläutert den
Unterschied zwischen synchronen und asynchronen Dynamic Actions, was ich in 5.1 ändert und
was für den Entwickler zu tun ist.
In Application Express 5.0 wurden nur Dynamic Actions, deren Attribut Wait for Result auf No steht, asynchron ausgeführt, ansonsten findet eine synchrone Ausführung statt. Ab Application Express 5.1 werden Dynamic Actions grundsätzlich asynchron ausgeführt. Das
bedeutet, dass eine Dynamic Action, die einen AJAX-Aufruf zum Server macht, den Browser nicht
mehr blockiert - nachfolgende
Aktionen können sofort loslaufen. Eine Dynamic Action führt dann einen AJAX-Request aus, wenn sie SQL-Abfragen oder PL/SQL-Code
auf dem Server ausführt. Damit folgt Application Express der allgemeinen Entwicklung von Web-Anwendungen; denn mit asynchron
ausgeführten AJAX-Requests ist die Anwendungsseite für den Endanwender flüssiger und prompter.
Ein Problem kann sich allerdings ergeben, wenn eine nachfolgende Aktion (eine andere Dynamic Action) vom Ergebnis
des AJAX-Requests abhängig ist - wenn beispielsweise das Ergebnis des AJAX-Requests weiterverarbeitet werden soll.
Das wollen wir uns nun etwas näher ansehen: Erzeugen Sie eine Application Express-Seite
mit einer Region und zwei Seitenelementen: P1_HIDDENVALUE und P1_TEXTVALUE.
Das erste Element ist,
wie der Name schon nahelegt, ein ausgeblendetes (Hidden), das zweite sei ein normales Textfeld. Fügen Sie noch
einen Button hinzu. Der Button bekommt den Namen Execute Dynamic Actions und zusätzlich "on Click"
zwei Dynamic Actions.
- Die erste Dynamic Action führt ein Set Value vom Typ SQL Statement durch. Als SQL Statement hinterlegen Sie select sysdate from dual. Das Affected Element ist P1_HIDDENVALUE. Stellen Sie Wait For Result auf Yes und Fire On Initialization auf No.
- Die zweite Dynamic Action führt ebenfalls ein Set Value, nun allerdings vom Typ Javascript Expression durch. Die Javascript Expression ist apex.item("P1_HIDDENVALUE").getValue(). Affected Element ist nun P1_TEXTVALUE. Stellen Sie auch hier Fire On Initialization auf No.
Es ist klar, was dieses Beispiel bezwecken soll: Die erste Dynamic Action führt den (ab APEX 5.1 asychronen) AJAX-Request durch, die zweite "verarbeitet" das Ergebnis weiter. Im Page Designer wird das ganze wie in etwa wie folgt aussehen:
Beispielseite mit Dynamic Actions
Bevor Sie die Seite nun starten, navigieren Sie zu den Gemeinsamen Komponenten,
und dort zu den Application Definition Attributes. Stellen Sie den Compatibility Mode
Ihrer Anwendung auf 5.0 - und nun starten Sie die Anwendung. Wenn Sie die Seite sehen,
klicken Sie den Button Execute Dynamic Action.
Beispielseite mit Dynamic Actions - mit Compatibility Mode 5.0
Wenn Sie den Button klicken, wird zunächst die erste Dynamic Action ausgeführt; diese
führt einen AJAX-Request zum Server durch und führt dort die SQL-Abfrage aus. In APEX 5.0
wurden Dynamic Actions synchron ausgeführt; der Compatibility Mode führt also dazu, dass
die zweite Dynamic Action erst ausgelöst wird, wenn die erste fertig ist. Da das Ergebnis
der SQL-Abfrage nun vorliegt, kann es problemlos ins Textfeld P1_TEXTITEM übernommen werden.
Stellen Sie nun den Compatibility Mode in den Gemeinsamen Komponenten auf 5.1 um und
starten Sie die Seite nochmals.
Beispielseite mit Dynamic Actions - mit Compatibility Mode 5.1
Mit dem Compatibility Mode 5.1 laufen Dynamic Actions asynchron - das bedeutet, dass die
zweite Dynamic Action unmittelbar nach dem Auslösen der ersten ausgelöst wird. Das Ergebnis
der SQL-Abfrage ist noch gar nicht da - soll aber schon in das Element P1_TEXTITEM übernommen
werden, was folgerichtig nicht funktioniert.
Aber was ist mit der Einstellung Wait for Result = Yes, werden nun einige fragen - denn damit
wurde doch explizit festgelegt, dass auf diese Dynamic Action gewartet werden soll. Allerdings
gilt dies für mehrere Schritte (TRUE oder FALSE Actions) innerhalb der gleichen Dynamic Action.
Wenn Sie also beide
Dynamic Actions in eine einzige, mit mehreren TRUE Actions, konsolidieren, dann werden Sie
das gewünschte Verhalten bekommen - und Application Express wird Wait for Result berücksichtigen.
"Wait For Result" gilt für mehrere Schritte innerhalb einer Dynamic Action
Für bestehende Anwendungen in der Praxis wird es wohl meist so sein, dass mehrere Dynamic Actions bislang nacheinander
(synchron) ausgeführt wurden und das auch so beabsichtigt war. Mit Application Express 5.1
ergibt sich hier Handlungsbedarf:
- Der erste Schritt ist sicherlich das Setzen (oder das Belassen) des Compatibility Mode
auf 5.0 - so werden die Dynamic Actions vorerst synchron ausgeführt. Allerdings sollte
das nur eine Übergangslösung sein. Um neuen Features in Application Express nutzen zu können, wollen Sie den
Compatibility Mode ja hochsetzen - und dann müssen die Dynamic Actions angepasst werden.
- Wenn Sie mehrere Dynamic Actions auf das gleiche Ereignis - und mit den gleichen
Bedingungen hinterlegt haben, konsolidieren Sie diese in eine einzige Dynamic Action und
setzen Sie Wait For Result auf Yes.
Sie bekommen den positiven Nebeneffekt, dass ihre Seite übersichtlicher wird.
- Wenn es nicht möglich ist, die Dynamic Actions zusammenzufassen, müssen Sie diese
für andere Ereignisse setzen. In obigem Beispiel kann die zweite Dynamic Action auch
auf das Ereignis Change des Elements P1_HIDDENVALUE gesetzt werden. Dann wird sie
ausgelöst, wenn P1_HIDDENVALUE mit dem Ergebnis der SQL-Abfrage gesetzt wird - Sie haben
dann eine auch asynchron funktionierende Abfolge von Dynamic Actions - quasi nach Lehrbuch.
Asynchrone Abfolge von Dynamic Actions: "P1_TEXTVALUE" wird on change of "P1_HIDDENVALUE" gesetzt
- Achten Sie besonders auf Dynamic Actions, die einen AJAX-Request durchführen und die
Before Page Submit ausgeführt werden. Wenn der Compatibility Mode auf 5.1 steht, findet der
Page Submit statt, bevor der AJAX-Request fertig ist und bestimmte Element werden nicht korrekt
an nachfolgende Seiten übergeben. Untersuchen Sie hier, ob die Dynamic Action überhaupt das Richtige
ist - im Falle eines Set Value wäre eine serverseitige Computation wahrscheinlich die bessere Alternative.
- Wenn Ihre Dynamic Actions keine AJAX-Requests ausführen, wie Show
oder Hide, können Sie entspannen; hier
gibt es nichts zu tun.
Fazit
Mit der Umstellung von Dynamic Actions auf asynchrone Ausführung folgt Application Express dem
allgemeinen Trend in der Web-Entwicklung - die asynchrone Ausführung hat viele Vorteile.
Ist der Compatibility Mode der Anwendung auf 5.0 gestellt, so ändert sich nichts - die Dynamic
Actions werden genauso ausgeführt wie zuvor.
Entwickler sollten sich ihre Anwendungen dennoch ansehen, die Dynamic Actions "fit" für die
asychrone Ausführung machen, um so den Compatibility Mode schließlich auf 5.1 hochsetzen zu können. Weitere,
wichtige Informationen zum neuen Application Express Release finden sich in der Dokumentation und in den
Release Notes.
Zurück zur Community-Seite
|