использование опроса a4j для обновления статуса процесса

Итак, что я пытаюсь сделать, так это: у меня есть цикл 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);
    }
}

person Joe    schedule 17.09.2013    source источник
comment
Я думаю, что именно так работает JSF, он не позволит вам получить доступ к переменной во время выполнения цикла.   -  person Makhiel    schedule 19.09.2013


Ответы (3)


Вы уверены, что опрос не выполняется каждую секунду? Чтобы проверить это, вы можете поместить атрибут действия и метод действия, чтобы увидеть, срабатывает ли он каждую 1 секунду. Мне кажется, что ваш код в порядке.

person Ellie Fabrero    schedule 18.09.2013

У вас опечатка:

</<a4j:outputPanel>

Правильный код:

</a4j:outputPanel>

Я смог запустить ваш пример с небольшими изменениями (отсутствующие поля в компоненте).

person Chaotic    schedule 06.11.2015

Вместо использования: render="poll,msg" -> используйте: reRender="poll,msg"

Теперь пул должен перерисовываться каждую секунду.

person Niklas Sundberg    schedule 10.05.2017