2014-02-12 35 views
2

我製作了一個實現PhaseListener的類,並將每個階段的時間打印到日誌中。現在我想將其打印到JSF頁面上,以便我可以看到每個階段在頁面呈現時需要多長時間。如何在頁面上顯示JSF相位時序

我不知道這是否可能;也許這是一個雞與雞蛋的問題?

代碼

由於LaurentG告訴我,這是不可能實現的目標我找了。如果有人在尋找代碼時相雖然,這裏是應該做的一種方式:

import javax.faces.event.PhaseEvent; 
import javax.faces.event.PhaseId; 
import javax.faces.event.PhaseListener; 

public class LogPhaseListener implements PhaseListener { 

    private long startTimeP1; 
    private long startTimeP2; 
    private long startTimeP3; 
    private long startTimeP4; 
    private long startTimeP5; 
    private long startTimeP6; 
    private long timeP1; 
    private long timeP2; 
    private long timeP3; 
    private long timeP4; 
    private long timeP5; 
    private long timeP6; 
    private long timeAll; 

    @Override 
    public void afterPhase(PhaseEvent event) { 

     if (event.getPhaseId() == PhaseId.RESTORE_VIEW) { 
      timeP1 = (long) ((System.nanoTime() - startTimeP1) * 0.000001); 
      System.err.println("|  Phase 1 Execution time -- RESTORE_VIEW -- " + timeP1 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) { 
      timeP2 = (long) ((System.nanoTime() - startTimeP2) * 0.000001); 
      System.err.println("|  Phase 2 Execution time -- APPLY_REQUEST_VALUES -- " + timeP2 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) { 
      timeP3 = (long) ((System.nanoTime() - startTimeP3) * 0.000001); 
      System.err.println("|  Phase 3 Execution time -- PROCESS_VALIDATIONS -- " + timeP3 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) { 
      timeP4 = (long) ((System.nanoTime() - startTimeP4) * 0.000001); 
      System.err.println("|  Phase 4 Execution time -- UPDATE_MODEL_VALUES -- " + timeP4 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) { 
      timeP5 = (long) ((System.nanoTime() - startTimeP5) * 0.000001); 
      System.err.println("|  Phase 5 Execution time -- INVOKE_APPLICATION -- " + timeP5 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) { 
      timeP6 = (long) ((System.nanoTime() - startTimeP6) * 0.000001); 
      timeAll = (long) ((System.nanoTime() - startTimeP1) * 0.000001); 

      System.err.println("|  Phase 6 Execution time -- RENDER_RESPONSE -- " + timeP6 + "ms"); 
      System.err.println("|  Phase X Execution time -- ALL_PHASES -- " + timeAll + "ms"); 
     } 
    } 

    @Override 
    public void beforePhase(PhaseEvent event) { 

     if (event.getPhaseId() == PhaseId.RESTORE_VIEW) { 
      startTimeP1 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) { 
      startTimeP2 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) { 
      startTimeP3 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) { 
      startTimeP4 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) { 
      startTimeP5 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) { 
      startTimeP6 = System.nanoTime(); 
     } 
    } 

    @Override 
    public PhaseId getPhaseId() { 
     return PhaseId.ANY_PHASE; 
    } 

} 

而下面添加到安迪·吉布森網站上發現faces-config.xml

<lifecycle> 
    <phase-listener>package.name.LogPhaseListener</phase-listener> 
</lifecycle> 

原始代碼:http://www.andygibson.net/blog/tutorial/timing-jsf-requests-using-a-phase-listener/

+0

快速和骯髒:通過Web服務提供日誌,您可以在客戶端使用JavaScript進行輪詢。 – mabi

回答

0

很明顯,您無法在要獲取渲染時間的頁面上打印RENDER_RESPONSE階段的時間。但是,您可以將時間保存在視圖或會話範圍[1] bean中,並稍後(例如,使用Ajax)在頁面中調用它。

替代方法:將進程時間存儲在一個bean中,並使用它來呈現一個特殊的調試頁面,您可以在其中監視所有呈現頁面的所有時間。這樣您也不會在調試信息中混入高效的頁面。

順便說一下,我發現你的想法很奇怪。我通常只需查看服務器日誌中的日誌。我還總是配置一個自定義PhaseListener,記錄每個階段的處理時間,並將其配置爲在特殊日誌中記錄時間(例如perf.log)。

鏈接:

+0

的確,我看不出邏輯上的工作方式,儘管我經常會想到其他更有知識的人做的事情,因此我的問題。我的目標是在開發過程中自動將這些信息呈現在頁面上;這並不重要,但我想知道是否有辦法實現這一點。感謝您花時間回答我的問題。 – nivis

2

您可以使用JSFInspector可視化頁面上的每一個生命週期階段的持續時間。