2010-03-15 97 views
1

我與閱讀收到的MQ消息的內容,我的JSF應用程序很高興,他們提供給用戶界面是這樣的:流媒體內容JSF UI

<rich:panel> 
<snip> 
    <rich:panelMenuItem label="mylabel" action="#{MyBacking.updateCurrent}"> 
    <f:param name="current" value="mylog.log" />  
    </rich:panelMenuItem> 
</snip> 
</rich:panel> 

<rich:panel> 
    <a4j:outputPanel ajaxRendered="true"> 
    <rich:insert content="#{MyBacking.log}" highlight="groovy" /> 
    </a4j:outputPanel> 
</rich:panel> 

和MyBacking.java

private String logFile = null; 
... 

    public String updateCurrent() { 
     FacesContext context=FacesContext.getCurrentInstance(); 
     setCurrent((String)context.getExternalContext().getRequestParameterMap().get("current")); 
     setLog(getCurrent()); 
     return null; 
    } 

    public void setLog(String log) { 
     sendMsg(log); 
     msgBody = receiveMsg(moreargs); 
     logFile = msgBody; 
    } 

    public String getLog() { 
     return logFile; 
    } 

直到其中一條消息的內容太大,tomcat崩潰。顯然,我想,我需要改變它的工作方式,以便返回某種形式的流,以便沒有一個對象增長得如此之大,以至於容器會死亡,並且由於連續消息返回的內容會在用戶界面流入UI時流入。

難道我就在想,我可以取代我現在做一個String對象上有BufferedOutputStream對象即不改變JSF代碼和這樣的變化在後端的東西的工作:

private BufferedOutputStream logFile = null; 

    public void setLog(String log) { 
     sendMsg(args); 
     logFile = (BufferedOutputStream) receiveMsg(moreargs); 
    } 

    public String getLog() { 
     return logFile; 
    } 

回答

1

如果Tomcat陷入困境,它必須超過128MB大或可能是雙倍(這是某些Tomcat版本的最小默認內存大小)。我不認爲用戶會喜歡訪問那個很大的網頁。在localhost上同時作爲服務器和客戶端時,它可能會感覺很快,但通過互聯網服務時,速度會降低100倍。

介紹尋呼/過濾。一次查詢並顯示100個條目。添加一個過濾器,返回特定的結果,如特定時間範圍或特定用戶的日誌等。

Google也不會在單個網頁中同時顯示所有可用結果,它們的服務器肯定會「跌倒「以及:)

更新根據評論:是否豆被放在會議範圍左右?這種方式很快就會積累在記憶中。流式傳輸只有在一側有InputStream,另一側有OutputStream時纔可以。沒有辦法將String轉換爲流,就像您的投射嘗試一樣,以便它不會再存儲在Java memroy中。源必須停留在另一端,並且必須通過該線逐字節地檢索。唯一可行的方法是使用,其src指向一些HttpServlet,它將來自源的數據直接傳輸到響應。

最好的辦法是將整個事物存儲在數據庫中,或者 - 如果它不包含用戶特定的數據 - 在應用程序範圍內並在所有會話/請求之間共享。

+0

感謝您的建議,但我的用戶不是基於互聯網的內部。雖然我確實將Tomcat設置爲默認memsize,但是一條消息(遠小於128 MB)導致問題的事實提醒我注意到,我可能有多個用戶請求這樣大小的文件,並且他們都期待着獲取整個文件並使用瀏覽器的查找功能來搜索解決問題的特定字符串。我曾想過分頁,但它確實是最後的手段。我認爲流式傳輸比文本搜索工具更簡單。 – volvox 2010-03-15 13:32:07

+0

@BalusC re update:重新考慮我將要做的解決方案似乎是合乎邏輯的。我想將bean保留在會話範圍內,儘管如果文件非常大,我可以使用輸出流讀取MQ隊列,但瀏覽器會坐在那裏並流失。我寧願提供更多用戶友好的方法。謝謝 – volvox 2010-03-15 14:25:27