Sto costruendo un'applicazione web Wicket che dovrà gestire molte richieste simultanee. Ho configurato un ambiente di test e alcuni script jmeter per eseguire il test di caricamento e ho notato che posso ridurre la CPU e l'impronta di memoria della mia applicazione se realizzo la maggior parte delle pagine Stateless.Come posso rendere Stateless "AjaxLink" di Wicket?
Ho aggiunto il codice al metodo onBeforeRender() della pagina più grande per mostrarmi quale dei componenti sta causando lo stato della mia pagina. Questo è il codice che ho per rilevare che:
@Override
protected void onBeforeRender() {
if (!getSession().isTemporary()) {
visitChildren(Component.class, new IVisitor<Component>() {
@Override
public Object component(Component component) {
String pageClassName = AbstractStatelessBasePage.this.getClass().getName();
if (!component.isStateless()) {
String msg = pageClassName+" is stateful because of stateful component " + component.getClass().getName() + " with id " + component.getId() + ".";
List<IBehavior> behaviourList = component.getBehaviors();
for (IBehavior iBehavior : behaviourList) {
if (!iBehavior.getStatelessHint(component)) {
msg += "\n\t" + "The component has stateful behaviour: " + iBehavior.getClass().getName();
}
}
LOG.error(msg);
}
checkedPages.add(pageClassName);
return CONTINUE_TRAVERSAL;
}
});
}
}
Nell'output vedo che il comportamento stateful è causato da AjaxLinks utilizzati da alcuni dei componenti esistenti nelle pagine:
ERROR - AbstractStatelessBasePage$1.component(45) | HomePage is stateful because of stateful component InfoGrid$InfoButton with id infoButton.
The component has stateful behaviour: org.apache.wicket.ajax.markup.html.AjaxLink$1
ho ho provato ad aggiungere i metodi getStatelessHint() restituendo "true" in alcuni punti, ma sembra che non aiuti. Ho anche controllato il codice sorgente di Wicket di AjaxLink, le sue superclassi e qualche codice circostante, ma non riesco a capire perché AjaxLink abbia bisogno di essere stato in tutti i casi.
Nel mio caso, AjaxLink si trova in una pagina altrimenti stateless e il collegamento non memorizza lo stato. Come posso far capire a Wicket che questo AjaxLink può essere apolide?
Grazie per il vostro aiuto, Rolf
Edit: accettato risposta funziona con Wicket 1.4.19.
aggiunto il seguente alla pom.xml Maven:
<dependency>
<groupId>com.jolira</groupId>
<artifactId>wicket-stateless</artifactId>
<version>1.0.8</version>
</dependency>
Modificato tutti i componenti che si estendevano "AjaxLink" estendere "StatelessAjaxFallbackLink".
Non dimenticate di aggiungere il seguente alla classe WicketApplication, che vi farà risparmiare un po 'di tempo di risoluzione dei problemi:
@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
return new StatelessWebRequestCycleProcessor();
}
prega di notare che StatelessForm e altre cose senza stato non funziona all'interno di un ripetitore (come " ListView ") per qualche motivo.
In realtà sostituisco i pannelli, ma lo registro all'interno della sessione, così quando istanziando la pagina posso istanziare i pannelli corretti "sostituiti". Questo sposta lo stato dalla pagina alla sessione. – Rolf
Jolira's StatelessAjaxFallbackLink ha risolto il problema che ho indicato nella mia domanda originale. In questo momento sto incontrando problemi con Stateless all'interno di ripetitori, in cui Wicket non riesce a capire quale componente targetizzare. Ciò potrebbe causare una nuova domanda :-) – Rolf
C'è qualcosa per Wicket 6.10? –