我與閱讀收到的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;
}
感謝您的建議,但我的用戶不是基於互聯網的內部。雖然我確實將Tomcat設置爲默認memsize,但是一條消息(遠小於128 MB)導致問題的事實提醒我注意到,我可能有多個用戶請求這樣大小的文件,並且他們都期待着獲取整個文件並使用瀏覽器的查找功能來搜索解決問題的特定字符串。我曾想過分頁,但它確實是最後的手段。我認爲流式傳輸比文本搜索工具更簡單。 – volvox 2010-03-15 13:32:07
@BalusC re update:重新考慮我將要做的解決方案似乎是合乎邏輯的。我想將bean保留在會話範圍內,儘管如果文件非常大,我可以使用輸出流讀取MQ隊列,但瀏覽器會坐在那裏並流失。我寧願提供更多用戶友好的方法。謝謝 – volvox 2010-03-15 14:25:27