如何保持客户端请求活着从服务器JSF
问题描述:
延迟响应我有一个号码:在的commandButton我的JSF页面。当用户点击时,会有大量数据从数据库中检索并写入Excel文件并作为响应返回给用户。这可能需要几个小时。但在使用IE几乎一小时后,它显示“无法加载页面”错误消息,即使该过程仍在服务器端运行。我知道这是因为客户端配置了服务器的预期响应时间。它不同于浏览器和浏览器。如何保持客户端请求活着从服务器JSF
即使是艰难的,我一直在计算过程中发送从服务器到客户端AJAX更新,以显示处理的数据用户的百分比和它的作品,但仍然是我客户端获取死了。此外,我的JSF页面上还有一个p:progressBar,它也显示了每个更新周期的百分比。
如何我把我的客户活着通过代码?所以在发送请求之后,它可能会等待很长时间才能响应。
我们必须使用不同的浏览器不同的用户。我需要一个适用于所有主流浏览器的解决方案。这是我的代码。
<p:dialog id="alert-exp-info-dialog"
widgetVar="alertExpInfoDialog">
<p:ajax event="close"
listener="#{bean.onExportDialogClose}"
process="@this"
update=":alert-exp-info-form"
immediate="true" />
<h:form id="alert-exp-info-form">
<h:outputFormat id="alert-exp-detail"
value="So info for user">
<f:param value="#{bean.exportedAlertsCount}" />
<f:param value="#{bean.totalExportableAlerts}" />
</h:outputFormat>
<p:progressBar id="alert-exp-progress"
widgetVar="alertExpProgress"
value="#{bean.exportProgress}"
labelTemplate="{value}%"
interval="3000"
ajax="true">
<p:ajax event="complete"
listener="# {bean.onExportComplete}"/>
<f:event type="preValidate"
update="alert-exp-abort-btn"
listener="#{bean.updateComponents}" />
</p:progressBar>
<h:panelGroup id="alert-exp-button-panel">
<p:commandButton id="alert-exp-proceed-btn"
value="Process"
action="#{bean.doCalculation}"
onclick="alertExpProgress.start();"
ajax="false">
<p:ajax update="alert-exp-button-panel" />
</p:commandButton>
</h:panelGroup>
</h:form>
</p:dialog>
public void doCalculation()
{
FacesContext context = FacesContext.getCurrentInstance();
//Too long calculation...
for (loop)
{
...
...
}
//Finally writing excel file on responce
context.setResponseContentType("application/vnd.openxmlformats- officedocument.spreadsheetml.sheet");
context.setResponseHeader("Expires", "0");
context.setResponseHeader("Cache-Control", "must-revalidate, post- check=0, pre-check=0");
context.setResponseHeader("Pragma", "public");
context.setResponseHeader("Content-disposition", "attachment;filename=" + (fileName.endsWith(".xlsx") ? fileName : fileName + ".xlsx"));
context.addResponseCookie(Constants.DOWNLOAD_COOKIE, "true", new HashMap<String, Object>());
OutputStream out = context.getResponseOutputStream();
generatedExcel.write(out);
out.close();
context.responseFlushBuffer();
context.responseComplete();
}
public void updateComponents()
{
RequestContext.getCurrentInstance().update("alert-exp-info-form:alert- exp-detail");
}
public void onExportComplete()
{
RequestContext context = RequestContext.getCurrentInstance();
context.execute("alertExpInfoDialog.hide();");
}
答
我通过ajax触发长时间处理解决了问题,最后通过单独的按钮单击下载生成的excel文件。
试图保持请求活那么久没有真正意义。为什么不能在流程完成后提出额外请求来获取数据? – charlietfl
@Undertaker客户期望做什么回应?你是什么意思_“用百分比持续更新客户”_?该描述是否与_相反?“因此,在发送请求之后,它可能会等待很长时间才能响应。”_?你尝试过使用'WebSocket'吗? – guest271314
编辑的问题。我在响应中写入excel文件,在UI中显示为弹出窗口,用户可以从浏览器保存或打开它。可能应该使用onExportComplete()来写入文件作为响应? – Undertaker