Jak mogę uczynić Wicket „AjaxLink” Stateless?

Buduję aplikację internetową Wicket, która będzie musiała obsłużyć wiele jednoczesnych żądań. Skonfigurowałem środowisko testowe i niektóre skrypty jmeterowe do testowania obciążenia i zauważyłem, że mogę zmniejszyć obciążenie procesora i pamięci w mojej aplikacji, jeśli zrobię większość stron Stateless.

Dodałem kod do metody onBeforeRender () największej strony, aby pokazać, który ze składników powoduje, że moja strona jest stanowa. Oto kod, który mam do wykrycia:

<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 wyjściu widzę, że zachowanie stanowe jest spowodowane przez AjaxLinks używane przez niektóre z istniejących komponentów na stronach:

<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>

Próbowałem dodać metody getStatelessHint () zwracające „true” w kilku miejscach, ale wydaje się, że nie pomaga. Sprawdziłem również kod źródłowy Wicket AjaxLink, jego nadklasy i niektóre otaczające go kody, ale nie mogę odkryć, dlaczego AjaxLink musi być stanowy we wszystkich przypadkach.

W moim przypadku AjaxLink znajduje się w innej stronie bezstanowej, a łącze nie przechowuje stanu. Jak sprawić, by Wicket zrozumiał, że ten AjaxLink może być bezstanowy?

Dzięki za pomoc, Rolf

Edytuj: zaakceptowana odpowiedź działa z Wicket 1.4.19.

Dodano następujące elementy do pliku maven pom.xml:

<code><dependency>
    <groupId>com.jolira</groupId>
    <artifactId>wicket-stateless</artifactId>
    <version>1.0.8</version>
</dependency>
</code>

Zmieniono wszystkie komponenty, które rozszerzyły „AjaxLink”, aby rozszerzyć „StatelessAjaxFallbackLink”.

Nie zapomnij dodać następujących elementów do klasy WicketApplication, zaoszczędzisz trochę czasu na rozwiązanie problemu:

<code>@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
    return new StatelessWebRequestCycleProcessor();
}
</code>

Należy pamiętać, że StatelessForm i inne rzeczy bezstanowe nie działają z powielacza (np. „ListView”) z jakiegoś powodu.

questionAnswers(2)

yourAnswerToTheQuestion