मैं एक विकेट वेब एप्लिकेशन बना रहा हूं जिसे कई सारे अनुरोधों को संभालना होगा। मैंने परीक्षण परीक्षण करने के लिए एक परीक्षण वातावरण और कुछ जेमीटर स्क्रिप्ट सेट की हैं और मुझे लगता है कि यदि मैं अधिकतर पेज स्टेटलेस बना देता हूं तो मैं अपने एप्लिकेशन के सीपीयू और मेमोरी पदचिह्न को कम कर सकता हूं।मैं विकेट के "अजाक्सलिंक" स्टेटलेस कैसे बना सकता हूं?
मैंने मुझे यह दिखाने के लिए सबसे बड़े पृष्ठ पर ऑनफ्रेंडर() विधि में कोड जोड़ा है कि कौन से घटक मेरे पृष्ठ को स्टेटफुल कर रहे हैं। इस कोड को मैं पता लगाने के लिए किया है कि:
@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
मेरे पास है getStatelessHint() विधियों को कुछ स्थानों में "सत्य" लौटने की विधि जोड़ने की कोशिश की, लेकिन ऐसा लगता है कि यह मदद नहीं करता है। मैंने अजाक्सलिंक, इसके सुपरक्लास और आसपास के कोड के विकेट स्रोत कोड की भी जांच की है, लेकिन मुझे लगता है कि अजाक्सलिंक को सभी मामलों में क्यों राज्यिक होना चाहिए।
मेरे मामले में, अजाक्सलिंक अन्यथा स्टेटलेस पेज में है और लिंक राज्य को संग्रहीत नहीं करता है। मैं विकेट को कैसे समझ सकता हूं कि यह अजाक्सलिंक स्टेटलेस हो सकता है?
आपकी मदद के लिए धन्यवाद, रॉल्फ
संपादित करें: स्वीकृत जवाब विकेट 1.4.19 के साथ काम करता है।
जोड़ा गया Maven pom.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 ") किसी कारण से।
मैं वास्तव में पैनलों को प्रतिस्थापित करता हूं, लेकिन मैं इसे सत्र के भीतर पंजीकृत करता हूं, इसलिए पृष्ठ को तुरंत चालू करते समय मैं सही "प्रतिस्थापित" पैनलों को तुरंत चालू कर सकता हूं। यह पृष्ठ से सत्र तक राज्य चलता है। – Rolf
जोलीरा की स्टेटलेसएजेक्सफॉलबैक लिंक ने मेरे मूल प्रश्न में बताई गई समस्या को हल किया। अभी मुझे स्टेटलेस के अंदर दोहराने वालों के साथ समस्याएं आ रही हैं, जहां विकेट यह पता नहीं लगा सकता कि किस घटक को लक्षित करना है। इसका परिणाम एक नया प्रश्न हो सकता है :-) – Rolf
क्या विकेट 6.10 के लिए कुछ भी है? –