簡體   English   中英

流內容到JSF UI

[英]Streaming content to JSF UI

我對JSF應用程序感到非常滿意,該應用程序讀取收到的MQ消息的內容並將其提供給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。

我是否認為我可以用BufferedOutputStream對象代替我現在在String對象上所做的工作,即,無需更改JSF代碼,並且在后端進行如下更改:

private BufferedOutputStream logFile = null;

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

    public String getLog() {
        return logFile;
    }

如果Tomcat失敗了,那么它必須超過128MB,或者可能是兩倍(這是某些Tomcat版本的最小默認內存大小)。 我認為用戶不會喜歡訪問這么大的網頁。 在本地主機上同時充當服務器和客戶端時,感覺可能很快,但是通過Internet提供服務時,它的速度可能會慢100倍。

介紹分頁/過濾。 一次查詢並僅顯示100個條目。 添加一個返回特定結果的過濾器,例如特定時間范圍或特定用戶的日志等。

Google也不會一次在一個網頁上顯示所有不計其數的可用結果,它們的服務器也肯定會“掉下來” :)

根據注釋進行更新 :Bean是否已放入會話范圍中? 這樣,它的確會很快在內存中累積。 僅當一側具有InputStream而另一側具有OutputStream時,才可以進行流傳輸。 沒有任何一種方法可以像嘗試轉換那樣將String轉換為流,從而不再將其存儲在Java內存中。 源必須留在另一端,並且必須通過該行逐字節地進行檢索。 唯一可行的方法是使用<iframe>src指向某個HttpServlet ,該HttpServlet直接將數據從源流傳輸到響應。

最好的選擇是將整個內容存儲在數據庫中,或者-如果其中不包含用戶特定的數據,則存儲在應用程序范圍內,並在所有會話/請求中共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM