2016-07-12 54 views
0

TomEE 1.5.2 Plus(myfaces 2.1.13)とPrimefaces 3.5を使用してWebアプリケーションを開発しました。典型的なサーバーの応答時間は約70msで、パフォーマンスは許容されます。 TomEE 7.0.0-M3 Plus(myfaces 2.2.9)およびPrimefaces 5.3に移行すると、これらの応答時間は最大900msになります。 「ネットワーク」タブのFirefox Webコンソールを使用して、これらのタイミングはすべて0msの受信時間で待機しています。これらは、p:remoteCommandサーバー要求であるようです。私たちのアプリは多くのp:dialog管理されたビュースコープ付きBeanを持つユーザーインターフェイスを持っています。 p:remoteCommandsのダイアログが多いほど、パフォーマンスは悪くなります。TomEE/Primefacesのネットワーク応答時間が非常に遅いアプリケーション

私はTomEE 7.0.1 Plus(myfaces 2.2.10とPrimefaces 6.0の方が良い結果は得られませんでした)を試しました。テストアプリケーションは、ボタンとap:remoteCommandを使用してカウンタを増分してフォームを更新し、 TomEE 7.0.0とPrimeface 5.3を使用して、20個のダイアログ、豆、ボタンから40倍の待ち時間(50ms〜100ms)を実現します。 TomEE 7.0.2/Primefaces 3.5環境でプロダクションモードを使用した場合、生産時間は約10%改善されます。サンプルアプリケーションコード:

メインのApp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:cc="http://java.sun.com/jsf/composite/components"> 

<h:head> 
    <title>COUNTER</title> 
</h:head> 


<h:body> 
    <ui:include src="/Dialogs/counterDialog.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog2.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog3.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog4.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog5.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog6.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog7.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog8.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog9.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog10.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog11.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog12.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog13.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog14.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog15.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog16.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog17.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog18.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog19.xhtml" /> 
    <ui:include src="/Dialogs/counterDialog20.xhtml" /> 

<h:form id="countForm"> 
    <input id="clickMe" type="button" value="clickMe" onclick="openCounterDialog();" /> 
    <h:outputText id="count" value="#{counter.count}" /> 
    <input id="clickMe2" type="button" value="clickMe2" onclick="openCounterDialog2();" /> 
    <h:outputText id="count2" value="#{counter2.count}" /> 
    <input id="clickMe3" type="button" value="clickMe3" onclick="openCounterDialog3();" /> 
    <h:outputText id="count3" value="#{counter3.count}" /> 
    <input id="clickMe4" type="button" value="clickMe4" onclick="openCounterDialog4();" /> 
    <h:outputText id="count4" value="#{counter4.count}" /> 
    <input id="clickMe5" type="button" value="clickMe5" onclick="openCounterDialog5();" /> 
    <h:outputText id="count5" value="#{counter5.count}" /> 
    <input id="clickMe6" type="button" value="clickMe6" onclick="openCounterDialog6();" /> 
    <h:outputText id="count6" value="#{counter6.count}" /> 
    <input id="clickMe7" type="button" value="clickMe7" onclick="openCounterDialog7();" /> 
    <h:outputText id="count7" value="#{counter7.count}" /> 
    <input id="clickMe8" type="button" value="clickMe8" onclick="openCounterDialog8();" /> 
    <h:outputText id="count8" value="#{counter8.count}" /> 
    <input id="clickMe9" type="button" value="clickMe9" onclick="openCounterDialog9();" /> 
    <h:outputText id="count9" value="#{counter9.count}" /> 
    <input id="clickMe10" type="button" value="clickMe10" onclick="openCounterDialog10();" /> 
    <h:outputText id="count10" value="#{counter10.count}" /> 
<div> 
    <input id="clickMe11" type="button" value="clickMe11" onclick="openCounterDialog11();" /> 
    <h:outputText id="count11" value="#{counter11.count}" /> 
    <input id="clickMe12" type="button" value="clickMe12" onclick="openCounterDialog12();" /> 
    <h:outputText id="count12" value="#{counter12.count}" /> 
    <input id="clickMe13" type="button" value="clickMe13" onclick="openCounterDialog13();" /> 
    <h:outputText id="count13" value="#{counter13.count}" /> 
    <input id="clickMe14" type="button" value="clickMe14" onclick="openCounterDialog14();" /> 
    <h:outputText id="count14" value="#{counter14.count}" /> 
    <input id="clickMe15" type="button" value="clickMe15" onclick="openCounterDialog15();" /> 
    <h:outputText id="count15" value="#{counter15.count}" /> 
    <input id="clickMe16" type="button" value="clickMe16" onclick="openCounterDialog16();" /> 
    <h:outputText id="count16" value="#{counter16.count}" /> 
    <input id="clickMe17" type="button" value="clickMe17" onclick="openCounterDialog17();" /> 
    <h:outputText id="count17" value="#{counter17.count}" /> 
    <input id="clickMe18" type="button" value="clickMe18" onclick="openCounterDialog18();" /> 
    <h:outputText id="count18" value="#{counter18.count}" /> 
    <input id="clickMe19" type="button" value="clickMe19" onclick="openCounterDialog19();" /> 
    <h:outputText id="count19" value="#{counter19.count}" /> 
    <input id="clickMe20" type="button" value="clickMe20" onclick="openCounterDialog20();" /> 
    <h:outputText id="count20" value="#{counter20.count}" /> 
</div> 

</h:form> 

</h:body> 

</html> 

ダイアログ

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:cc="http://java.sun.com/jsf/composite/components"> 

    <p:dialog 
    id="counterDialog1" 
    header="Counter Form" 
    widgetVar="counterWidget" 
    closeOnEscape="true" > 

    <p:ajax 
     event="close" 
     listener="#{counter.buttonHit()}" 
     update="counterForm" 
     resetValues="true" /> 

    <h:form id="counterForm"> 

     <p:panel id="counterPanel">   
      <input id="countMe" type="button" value="countMe" onclick="customfunction();" /> 
      <p:remoteCommand name="increment" actionListener="#{counter.increment}" update=":countForm" /> 
     </p:panel> 

     <div 
     align="center" 
     style="padding: 5px"> 

     <p:commandButton 
      id="counterOK" 
      value="Ok" 
      cache="false" 
      ajax="true" 
      style="valign:bottom;float:left;padding-left:10px" 
      onclick="closeCounterDialog()" /> 

     <p:commandButton 
      id="counterCancel" 
      value="Cancel" 
      style="valign:bottom;float:center;padding-right:10px" 
      onclick="closeCounterDialog()" 
      process="@this"> 

     </p:commandButton> 

     <p:commandButton 
      id="counterHelp" 
      value="Help" 
      style="valign:bottom;float:right;padding-right:10px" 
      disabled="true"> 
     </p:commandButton> 

     <p:defaultCommand 
      target="counterOK" /> 

     </div> 
    </h:form> 
    </p:dialog> 

    <script type="text/javascript"> 
      //<![CDATA[ 
      // Keep script tag outside of any component tag that may need to get updated 
      // so JavaScript objects are not recreated. E.g. removing event handlers 
      // won't work after update since handler function is a different intance 
      function openCounterDialog (event) 
      { 
       counterWidget.show(); 
      } 

      /** 
      * Remove all the relevant event listeners, re-enable normal behavior and 
      * hide the dialog 
      */ 
      function closeCounterDialog() 
      { 
       counterWidget.hide(); 
      } 

      function customfunction() 
      { 
       //your custom code 
       increment(); //makes a remote call 
      } 

     //]]> 
    </script> 



</ui:composition> 

マネージドBeanクラス

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

import org.primefaces.context.RequestContext; 

@ManagedBean(name = "counter") 
@ViewScoped 
public class Counter implements Serializable 
{ 
/** Prevents compiler generating brittle one */ 
    private static final long serialVersionUID = -2L; 


    int count; 


    public Counter() 
    { 
    count = 0; 
    } 

    public void increment() 
    { 
    count++; 
    } 

    public int getCount() 
    { 
    return count; 
    } 

    public void buttonHit() 
    { 
    RequestContext.getCurrentInstance().execute ("closeCounterDialog()"); 
    } 

} 

任意のアイデア?前もって感謝します!

+0

あなたは、要求と応答の内容の違いをチェックしましたか?サーバー側をプロファイルしましたか? phaselistenerと?私はそれが正しく働いたかどうか疑問に思ういくつかの非常に奇妙なデザインのものを参照してください。またはサンプルテストアプリが間違っていて、実際のアプリは – Kukeltje

+0

ではありません。サンプルアプリは、実際のアプリと同じデザインです。私が提供したサンプルアプリケーションのデザインで、あなたが見ているものを間違っていると定義できますか?ありがとうございました。 –

答えて

0

primefacesの一部のバージョンでは、リクエストごとに1つの検証用Validatorが作成されます。カスタマイズされている場合、JSF環境ではよくあることですが、実際にはアプリケーションの処理速度が低下します。この問題が発生していないバージョンを使用していることを確認してください。ここで

は、関連する問題である:https://github.com/primefaces/primefaces/issues/1119

関連する問題