Сохранение ссылки на фоновую ветку в Grails? - PullRequest
0 голосов
/ 29 декабря 2011

Моему приложению Grails 1.3.7 необходимо обрабатывать большие XML-файлы, поэтому у меня есть контроллер, на который я загружаю большой файл, а затем я указываю путь этого файла на сервере в фоновый поток, который выполняет обработку так,что я могу сразу вернуться из действия контроллера.

На данный момент я использую плагин Grails Executor, и он работает нормально.У меня есть объект Домена загрузки, который обновляется в процессе обработки (текущее состояние, количество обработанных элементов и т. Д.).Но теперь у меня есть еще 2 требования:

  • , когда приложение аварийно завершает работу или сервер выключен, я хотел бы перехватить это и обновить свой домен для загрузки, чтобы сообщить, что процесс был прерван
  • Я хочу, чтобы пользователь мог сам прервать обработку при нажатии на ссылку и, возможно, возобновить ее из действий контроллера

Есть ли способ сохранить ссылку на мою фоновую задачу и перехватить любуюпрерывание фреймворка java.util.concurrent (который используется плагином Executor)?

А если я не могу сделать это с помощью util.concurrent, возможно ли это с другими плагинами / фреймворками?Например, я взглянул на Кварц, но не понимаю, как это сделать.

1 Ответ

2 голосов
/ 29 декабря 2011

Я не хочу отвечать, не проверив его полностью, но плагин grails-executor docs заявляет, что метод callAsync возвращает объект java.util.concurrent.Future .

Этот объект может использоваться для выполнения двух действий:

  1. Определить, завершен ли процесс или отменен.
  2. Отменить запущенный процесс (даже прервать его при необходимости).

Теоретически, вы должны быть в состоянии сохранить это Будущее в сеансе вашего пользователя где-нибудь.Затем вы можете получить его позже и использовать его для проверки состояния и / или отмены процесса по мере необходимости.

Что-то вроде:

session.backgroundProcess = callAsync{...}

// later
def bgProc = session.backgroundProcess
if(bgProc && !(bgProc.done || bgProc.cancelled)) {
    // process is still running
}

Это просто идея, она не проверена.Я также не знаю, есть ли проблемы с этим, приводящие к утечкам памяти.Вам нужно убедиться, что вы отсоединили Future после завершения процесса.

...