Como posso tornar o "AjaxLink" do Wicket sem estado?
Eu estou construindo uma aplicação web Wicket que vai ter que lidar com um monte de solicitações simultâneas. Eu configurei um ambiente de teste e alguns scripts de jmeter para fazer o teste de carga e percebo que posso reduzir a pegada de CPU e memória do meu aplicativo se eu fizer a maioria das páginas sem estado.
Eu adicionei código ao método onBeforeRender () da maior página para mostrar quais dos componentes estão fazendo com que minha página seja stateful. Este é o código que tenho para detectar isso:
<code>@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; } }); } } </code>
Na saída, vejo que o comportamento stateful é causado pelos AjaxLinks usados por alguns dos componentes existentes nas páginas:
<code>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 </code>
Eu tentei adicionar métodos getStatelessHint () retornando "true" em alguns lugares, mas parece não ajudar. Também verifiquei o código-fonte do Wicket do AjaxLink, suas superclasses e algum código circundante, mas não consigo descobrir por que o AjaxLink precisa ser stateful em todos os casos.
No meu caso, o AjaxLink está em uma página Stateless e o link não armazena o estado. Como posso fazer com que o Wicket entenda que esse AjaxLink pode ser sem estado?
Obrigado pela sua ajuda, Rolf
Editar: Resposta aceita funciona com o Wicket 1.4.19.
Adicionado o seguinte ao maven pom.xml:
<code><dependency> <groupId>com.jolira</groupId> <artifactId>wicket-stateless</artifactId> <version>1.0.8</version> </dependency> </code>
Mudou todos os componentes que estenderam "AjaxLink" para estender "StatelessAjaxFallbackLink".
Não se esqueça de adicionar o seguinte à sua classe WicketApplication, isso poupará algum tempo para a solução de problemas:
<code>@Override protected IRequestCycleProcessor newRequestCycleProcessor() { return new StatelessWebRequestCycleProcessor(); } </code>
Por favor, note que o StatelessForm e outras coisas sem estado não funcionam dentro de um repetidor (como "ListView") por algum motivo.