2016-12-24 100 views
1

延迟响应我有一个号码:在的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();"); 
} 
+2

试图保持请求活那么久没有真正意义。为什么不能在流程完成后提出额外请求来获取数据? – charlietfl

+1

@Undertaker客户期望做什么回应?你是什​​么意思_“用百分比持续更新客户”_?该描述是否与_相反?“因此,在发送请求之后,它可能会等待很长时间才能响应。”_?你尝试过使用'WebSocket'吗? – guest271314

+0

编辑的问题。我在响应中写入excel文件,在UI中显示为弹出窗口,用户可以从浏览器保存或打开它。可能应该使用onExportComplete()来写入文件作为响应? – Undertaker

回答

0

我通过ajax触发长时间处理解决了问题,最后通过单独的按钮单击下载生成的excel文件。

相关问题