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