多数の同時リクエストを処理する必要があるWicketWebアプリケーションを構築しています。負荷テストを行うためのテスト環境といくつかのjmeterスクリプトをセットアップしましたが、ほとんどのページをステートレスにすると、アプリケーションのCPUとメモリのフットプリントを削減できることに気付きました。
最大のページのonBeforeRender()メソッドにコードを追加して、ページがステートフルになる原因となっているコンポーネントを示しています。これは私がそれを検出するために持っているコードです:
@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;
}
});
}
}
出力では、ステートフル動作は、ページ内の既存のコンポーネントの一部で使用されているAjaxLinksによって引き起こされていることがわかります。
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
いくつかの場所で「true」を返すgetStatelessHint()メソッドを追加しようとしましたが、役に立たないようです。AjaxLinkのWicketソースコード、そのスーパークラス、およびいくつかの周辺コードも確認しましたが、AjaxLinkがすべての場合にステートフルである必要がある理由を発見できないようです。
私の場合、AjaxLinkはステートレスページにあり、リンクはステートを保存しません。このAjaxLinkがステートレスになる可能性があることをWicketに理解させるにはどうすればよいですか?
助けてくれてありがとう、ロルフ
編集:受け入れられた回答はWicket1.4.19で機能します。
以下をmavenpom.xmlに追加しました。
<dependency>
<groupId>com.jolira</groupId>
<artifactId>wicket-stateless</artifactId>
<version>1.0.8</version>
</dependency>
「AjaxLink」を拡張したすべてのコンポーネントを「StatelessAjaxFallbackLink」を拡張するように変更しました。
WicketApplicationクラスに以下を追加することを忘れないでください。トラブルシューティングの時間を節約できます。
@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
return new StatelessWebRequestCycleProcessor();
}
StatelessFormやその他のステートレスなものは、何らかの理由でリピーター(「ListView」など)内からは機能しないことに注意してください。