Ich baue eine Wicket-Webanwendung, die viele gleichzeitige Anfragen bearbeiten muss. Ich habe eine Testumgebung und einige Jmeter-Skripte eingerichtet, um die Tests zu testen, und ich merke, dass ich den CPU- und Speicherbedarf meiner Anwendung reduzieren kann, wenn ich die meisten Seiten zustandslos mache.
Ich habe der onBeforeRender () -Methode der größten Seite Code hinzugefügt, um mir zu zeigen, welche der Komponenten meine Seite stateful macht. Dies ist der Code, den ich habe, um folgendes zu erkennen:
%Vor%In der Ausgabe sehe ich, dass das statusbehaftete Verhalten von AjaxLinks verursacht wird, die von einigen der vorhandenen Komponenten in den Seiten verwendet werden:
%Vor%Ich habe versucht, getStatelessHint () -Methoden hinzuzufügen, die an einigen Stellen "true" zurückgeben, aber es scheint nicht zu helfen. Ich habe auch den Wicket-Quellcode von AjaxLink, seine Oberklassen und etwas umgebenden Code überprüft, aber ich kann nicht herausfinden, warum AjaxLink in allen Fällen statusbehaftet sein muss.
In meinem Fall befindet sich der AjaxLink auf einer ansonsten zustandslosen Seite und der Link speichert den Status nicht. Wie kann ich Wicket verstehen, dass dieser AjaxLink zustandslos sein kann?
Danke für Ihre Hilfe, Rolf
Bearbeiten: Akzeptierte Antwort funktioniert mit Wicket 1.4.19.
Folgendes zum maven pom.xml hinzugefügt:
%Vor%Alle Komponenten wurden geändert, die "AjaxLink" erweitert haben, um "StatelessAjaxFallbackLink" zu erweitern.
Vergessen Sie nicht, Ihrer WicketApplication-Klasse Folgendes hinzuzufügen: So sparen Sie sich Zeit für die Fehlersuche:
%Vor%Bitte beachten Sie, dass StatelessForm und andere zustandslose Sachen aus irgendeinem Grund nicht innerhalb eines Repeaters (wie "ListView") funktionieren.
Die Seite wird statusbehaftet, wenn Sie ihr ein Ajax-Verhalten hinzufügen (AjaxLink verwendet AjaxEventBehavior). Dies liegt daran, dass Wicket beim Klicken auf eine Verbindung versucht, die Seiteninstanz auf dem Server zu finden, dann die Verbindungskomponente darin zu finden und schließlich seine Rückrufmethode - z. onClick (). Ohne Speichern der Seite gibt es keine Möglichkeit, die Ajax-Verhaltensinstanz zu finden und ihre Callback-Methode auszuführen.
Sie können Joliras Verhalten und Komponenten von Ajax verwenden (https://github.com/jolira/wicket-stateless). Sie funktionieren ein bisschen anders - wenn Sie auf Joliras AjaxLink klicken, erstellt der Ajax-Aufruf eine komplett neue Instanz der Seite, findet den frisch erstellten StatelessAjaxLink darin, führt seine Callback-Methode aus, verwendet schließlich AjaxRequestTarget, um Komponenten / Javascript für die Ajax-Antwort hinzuzufügen verwirft die neu erstellte Seiteninstanz (es wird Müll gesammelt). Die nächste Ajax-Anfrage macht dasselbe mit einer komplett neuen Seiteninstanz.
Man würde fragen: "Warum ist Joliras Code nicht im Wicket-Kern?" - weil es eine teilweise Lösung gibt. Beispiel: Durch Klicken auf statuslessAjaxLink1 wird eine neue Seite erstellt, onClick () für die neue Instanz von StatelessAjaxLink ausgeführt, wobei PanelA durch PanelB ersetzt wird, und dieses Panel (PanelB) wird zu AjaxRequestTarget hinzugefügt. Kurz gesagt: Wenn Sie auf diesen Link klicken, wird der Hauptteil eines Bereichs auf der Seite ersetzt. Wenn PanelB einen StatelessAjaxLink2 in sich selbst hat, ist dieser Link nicht zu finden. Warum ? Wenn Sie darauf klicken, wird eine neue Instanz der Seite erstellt und diese neue Instanz wird über PanelA verfügen, nicht über PanelB. Daher gibt es keine Möglichkeit, StatelessAjaxLink2 für die Ausführung der onClick () -Methode zu finden.
Wenn Ihr Szenario einfach genug ist und Joliras Komponenten Ihre Fälle abdecken, verwenden Sie sie. Seien Sie sich jedoch bewusst, dass ein komplexeres Szenario fehlschlagen kann.
Es gibt Code für einen statuslosen AjaxFallbackLink
, auf den verwiesen wird Wicket Wiki , und ein damit zusammenhängendes Github-Projekt, das Sie von dort aus zu folgenden Links bekommen können. Nicht sicher, dass dies Ihr Problem vollständig lösen wird, aber es kann zumindest lehrreich sein.
Ein ähnlicher Ansatz wurde für Wicket 6 versucht, aber der Autor warnt davor, dass es experimentell ist. Der Code ist hier . Ich habe nicht versucht, es zu benutzen und kann deshalb nicht dafür bürgen.