2012-05-14 22 views
8

Ben eşzamanlı istek bir çok şeyin üstesinden zorunda olacak bir Wicket web uygulaması inşa ediyorum. Yükleme testi yapmak için bir test ortamı ve bazı jmeter komut dosyaları kurdum ve çoğu sayfayı Stateless yaparsam uygulamamın CPU ve bellek ayak izini azaltabildiğimi farkettim.Wicket'in "AjaxLink" Vatansızlığını nasıl yapabilirim?

Ben durum bilgisi olmak Sayfamı neden olan bileşenlerin hangi bana göstermek için büyük sayfanın onBeforeRender() yöntemine kodunu ekledik. Bu benim tespit etmek için var kod şudur:

Ben durum bilgisi davranış sayfalarında mevcut bileşenlerden bazıları tarafından kullanılan AjaxLinks kaynaklanır görüyoruz çıktısında
@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; 
      } 
     }); 
    } 
} 

:

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 

Ben Birkaç yerde "true" döndüren getStatelessHint() yöntemlerini eklemeyi denedi, ancak yardımcı olmadı. Ayrıca AjaxLink, üst sınıfları ve bazı çevreleyen kodların Wicket kaynak kodunu da kontrol ettim, ancak AjaxLink'in neden her durumda durumsal olması gerektiğini anlayamıyorum. Benim durumumda

, AjaxLink bir başka Vatansız sayfasında ve bağlantı durumunu saklamaz. Wicket'i bu AjaxLink'in vatansız olabileceğini nasıl anlayabilirim? Yardımlarınız için

sayesinde Rolf

Düzenleme: Kabul cevap Wicket 1.4.19 ile çalışır.

Eklenen maven pom.xml aşağıdaki:

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

"StatelessAjaxFallbackLink" genişletmek için "AjaxLink" genişletilmiş tüm bileşenleri değiştirildi.

eklemeyi unutmayın sizin WicketApplication sınıfa aşağıdaki size bazı sorun giderme zaman kazandıracak: "benzeri (

@Override 
protected IRequestCycleProcessor newRequestCycleProcessor() { 
    return new StatelessWebRequestCycleProcessor(); 
} 

StatelessForm ve diğer vatansız şeyler tekrarlayıcı içinden çalışmıyor lütfen unutmayın Herhangi bir nedenle ListView ").

cevap

10

sayfa durum bilgisi olur. Bunun nedeni, bir bağlantıyı tıklattığınızda, Wicket, sunucudaki sayfa örneğini bulmaya çalışır, ardından içindeki bağlantı bileşenini bulur ve son olarak geri çağrı yöntemini çalıştırır. tıklamada(). Sayfayı kaydetmeden ajax davranış örneğinin nasıl bulunacağı ve geri arama yönteminin nasıl yürütüleceği hakkında bir yol yoktur.

Sen Jolira en Ajax davranışları ve bileşenlerini kullanabilirsiniz (https://github.com/jolira/wicket-stateless).Farklı bir şekilde çalışırlar - Jolira'nın AjaxLink'i tıkladığınızda Ajax çağrısı sayfanın tamamen yeni bir örneğini oluşturur, yeni oluşturulmuş StatelessAjaxLink'i bulur, geri arama yöntemini yürütür, sonunda Ajax yanıtı için bileşenler/javascript eklemek için AjaxRequestTarget kullanır. yeni oluşturulan sayfa örneğini atar (toplanan çöp). Sonraki Ajax isteği tamamen yeni bir sayfa örneği ile aynı şeyi yapar.

"Neden Jolira'nın kodu Wicket çekirdeğinde yok?" - Çünkü kısmi çözüm veriyor. Örneğin: statelessAjaxLink1'e tıklamak yeni bir Sayfa oluşturur, StatelessAjaxLink'in yeni örneğinde PanelA'nın yerini PanelB ile değiştirir ve bu paneli (PanelB) AjaxRequestTarget'e ekler. Kısaca: Bu bağlantıyı tıklatarak sayfadaki bir panelin gövdesini değiştirir. Eğer PanelB kendi içinde bir StatelessAjaxLink2 varsa, bu bağlantı bu dengesizdir. Niye ya ? Üzerine tıklamak, sayfanın yeni bir örneğini oluşturacağından ve bu yeni örneğin PanelB'ye değil, PanelA'ya sahip olacağından, StatelessAjaxLink2 öğesinin onClick() yöntemini yürütmesi için bir yolu yoktur.

Eğer senaryonuz yeterince basitse ve Jolira'nın bileşenleri sizin durumunuzu ele alıyorsa, bunları kullanın. Sadece daha karmaşık senaryoların başarısız olabileceğinin farkında olun.

+0

Aslında panelleri değiştiriyorum, ancak oturumda bunu kaydediyorum, böylece sayfayı başlatırken doğru "değiştirilen" panelleri oluşturabilirim. Bu, durumu sayfadan oturuma taşır. – Rolf

+0

Jolira'nın StatelessAjaxFallbackLink orijinal sorumu içinde belirttiğim sorunu çözdü. Şu anda, Wicket'in hangi bileşenin hedefleneceğini anlayamadığı, tekrarlayan iç mekanlarda sorunla karşılaşıyorum. Bu yeni bir soruyla sonuçlanabilir :-) – Rolf

+0

Wicket 6.10 için bir şey var mı? –

3

wicket wiki numaralı başvuruda belirtilen bir vatansız AjaxFallbackLink kodu ve aşağıdaki bağlantılara alabileceğiniz ilgili bir github projesi vardır. Bunun probleminizi tamamen çözeceğinden emin değilsiniz, ancak en azından öğretici olabilir.

Benzer bir yaklaşım

wicket 6 için denendi, ama yazar deneyseldir uyarır. Kod here. Kullanmaya çalışmadım ve bunun için kefil olamaz. Eğer (AjaxLink AjaxEventBehavior kullanır) buna bir Ajax davranışı eklediğinizde

+0

Wicket 6.10 için bir şey var mı? –

+0

@Hendy Irawan - Güncellememi görün! –