Tôi đang xây dựng một ứng dụng web Wicket vốn sẽ phải xử lý nhiều yêu cầu đồng thời. Tôi đã thiết lập một môi trường thử nghiệm và một số kịch bản lệnh jmeter để thực hiện kiểm tra tải và tôi nhận thấy rằng tôi có thể làm giảm CPU và bộ nhớ của ứng dụng của mình nếu tôi làm cho hầu hết các trang không có trạng thái.Làm cách nào để tôi có thể tạo trạng thái "AjaxLink" của Wicket?
Tôi đã thêm mã vào phương thức onBeforeRender() của trang lớn nhất để cho tôi biết thành phần nào đang khiến trang của tôi trở nên có trạng thái. Đây là mã tôi có để phát hiện rằng:
@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;
}
});
}
}
Trong đầu ra tôi thấy rằng các hành vi stateful là do AjaxLinks được sử dụng bởi một số thành phần hiện có trong các trang:
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
Tôi có đã cố gắng thêm phương thức getStatelessHint() trả về "true" ở một vài nơi, nhưng nó dường như không giúp được gì. Tôi cũng đã kiểm tra mã nguồn Wicket của AjaxLink, các lớp siêu lớp của nó và một số mã xung quanh, nhưng tôi dường như không thể khám phá tại sao AjaxLink cần phải có trạng thái stateful trong mọi trường hợp.
Trong trường hợp của tôi, AjaxLink nằm trong trang không có quốc tịch và liên kết không lưu trữ trạng thái. Làm thế nào tôi có thể làm cho Wicket hiểu rằng AjaxLink này có thể là phi trạng thái?
Nhờ sự giúp đỡ của bạn, Rolf
Edit: Được chấp nhận câu trả lời làm việc với Wicket 1.4.19.
gia tăng như sau để pom.xml maven:
<dependency>
<groupId>com.jolira</groupId>
<artifactId>wicket-stateless</artifactId>
<version>1.0.8</version>
</dependency>
Thay đổi tất cả các thành phần trong đó mở rộng "AjaxLink" mở rộng "StatelessAjaxFallbackLink".
Đừng quên thêm dòng sau vào lớp WicketApplication của bạn, nó sẽ giúp bạn tiết kiệm thời gian xử lý sự cố:
@Override
protected IRequestCycleProcessor newRequestCycleProcessor() {
return new StatelessWebRequestCycleProcessor();
}
Xin lưu ý rằng StatelessForm và các công cụ khác không quốc tịch không hoạt động từ bên trong một repeater (như " ListView ") vì một lý do nào đó.
Tôi thực sự làm bảng thay thế, nhưng tôi đăng ký trong phiên, vì vậy khi instantiating trang tôi có thể nhanh chóng chính xác "thay thế" tấm. Điều này chuyển trạng thái từ trang này sang phiên khác. – Rolf
StatelessAjaxFallbackLink của Jolira đã giải quyết được vấn đề tôi đã nêu trong câu hỏi ban đầu của tôi. Ngay bây giờ tôi đang gặp phải vấn đề với Stateless bên trong lặp, nơi Wicket không thể tìm ra những thành phần để nhắm mục tiêu. Điều này có thể dẫn đến một câu hỏi mới :-) – Rolf
Có điều gì cho Wicket 6.10 không? –