【问题标题】:using a4j polling to update process status使用 a4j 轮询更新进程状态
【发布时间】:2013-09-17 21:24:46
【问题描述】:

所以我想做的是: 我有一个生成文件的 for 循环。现在这可能需要一些时间。例如,假设在我的函数中生成文件可能需要 1-10 秒之间的任何时间。但是,我想每秒使用 a4j:poll 来查看到目前为止已经生成了多少文件。

对于我所做的方式,轮询似乎一直等到 for 循环完成执行,即使它的间隔是 1 秒。有没有办法让轮询仍然每秒检查一个变量的值,即使循环仍在执行。

我是否按预期使用 a4j:poll?如果不是正确的方法是什么?有没有更好的组件可以用来做这个?

这是我的jsf代码:

<h:form>
<a4j:outputPanel ajaxRendered="true">
    <a4j:region id="pollregion" ajaxRendered="true">
         <a4j:poll id="poll" interval="1000" enabled="#{bean.pollEnabled}"
            render="poll,msg" />
    </a4j:region>
</<a4j:outputPanel>

<h:commandButton value="Generate Report" type="button"
    action="#{bean.generateReports}">
    <a4j:ajax event="click" render="poll,msg" />
</h:commandButton>

<a4j:outputPanel id="msg">
    <h:outputText value="#{bean.status}" />
</a4j:outputPanel>
 </h:form>

这是我的豆子:

private Integer totalCount;
private Integer processedCount;
private String last;
private String status;
private boolean pollEnabled = false;


public void generateReports() {
    reportStatus = "start";

    totalCount = getSelectedIds().length;
    processedCount = 0;

    pollEnabled = true;

    status = "Initiating report generation...";

    try{
        String[] ids = getSelectedIds();
        for(String id: rbIds){
            try
            {
              //generate report
            last = id;
            processedCount ++;
            status = "Processed " +  processedCount +" of " + totalCount + ". Last processed : " + last + ".";
            }catch(Exception e){
                displayException(e);
            }
        }

        status = "Successfully generated file.";
        pollEnabled = false;

    }catch(Exception e){
        displayException(e);
    }
}

【问题讨论】:

  • 我认为这是 JSF 的工作方式,它不会让您在循环运行时访问变量。

标签: jsf richfaces ajax4jsf


【解决方案1】:

您确定轮询不是每 1 秒执行一次吗?为了检查,您可以 放置动作属性和动作方法,看看它是否每 1 秒触发一次。在我看来,您的代码很好。

【讨论】:

    【解决方案2】:

    你有一个错字:

    </<a4j:outputPanel>
    

    正确的代码是:

    </a4j:outputPanel>
    

    我能够在稍作修改(bean 中缺少字段)的情况下运行您的示例。

    【讨论】:

      【解决方案3】:

      而不是使用:render="poll,msg" -> 使用:reRender="poll,msg"

      池现在应该每秒重新渲染一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2010-10-14
        • 2012-01-12
        • 1970-01-01
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多