Прервать длительный вызов ajax из CommandButton ActionListener?

#ajax #primefaces

#ajax #основные возможности

Вопрос:

Я хотел бы иметь возможность остановить выполнение длительной задачи, запущенной с помощью CommandButton:

 <p:commandButton id="startBatch"value="Go" actionListener="#{batchController.sendBatch()}"ajax="true"  />
  

Итак, в моей модели я добавил логическое значение «прервать» и внутри sendBatch() Я добавил проверку, чтобы остановить цикл, когда логическое значение становится истинным:

 for (int i = 1; i <= batch.size(); i  ) {
    if (batchModel.isAbort()) {
        break;
    }
}
  

И в моем XHTML я добавил новую кнопку, которая вызывает метод, который устанавливает это логическое значение в true:

 <p:commandButton id="abortBatchButton"
value="Abort"
actionListener="#{batchController.abort()}"
ajax="true"/>   
  

Проблема в том, что abort() вызывается после завершения метода sendBatch().

Есть ли простой способ реализовать это?

Комментарии:

1. Попробуйте async="true" нажать на кнопку, которая запускает пакет. Кстати, ajax="true" по умолчанию для p:commandButton .

2. Ну, теперь ты меня знаешь 🙂 Это сработало, спасибо. Как обычно, я попрошу вас опубликовать ответ.

Ответ №1:

По умолчанию p:commandButton используется Ajax. Однако несколько действий (запросов) по умолчанию помещаются в очередь и выполняются синхронно. Итак, если вы начали длительное действие, следующее действие будет обработано после завершения предыдущих действий.

Если вы не хотите ставить действия в очередь, вы должны использовать async="true" на соответствующих кнопках.

В вашем случае:

 <p:commandButton id="startBatch"
                 value="Go"
                 async="true"
                 actionListener="#{batchController.sendBatch()}" />
  

Я удалил ajax="true" , поскольку он установлен по умолчанию.