2010-10-22 2 views
1

Я создаю исследовательское веб-приложение, которое запускает длительный пакетный анализ, который может длиться часами. Я использую Grails, но я думаю, что это общая проблема дизайна. Последовательный процесс можно запустить по URL-адресу, например.Выполнение длинных экспериментов с веб-интерфейса

http://mydomain/experiment/run?a_lot_of_params

И эта страница возвращает информацию о эксперименте (чьи данные хранятся в задней части и доступны через другой веб-интерфейс). , например.

Experiment finished: results available at 
http://mydomain/experiment/data/myexperiment.xml 

Проблема с этим подходом заключается в следующем: если эксперимент длится несколько минут, это прекрасно, если вы оставите ожидающую веб-страницу. Но что будет, если эксперимент длится 10 часов? Что делать, если пользователь закрывает страницу? Правильный ли шаблон дизайна для этого типа ситуации?

Спасибо за любые подсказки.

+0

Что вы в итоге сделали? –

ответ

2

Вы можете дать пользователю токен и ввести их в этот токен, чтобы просмотреть статус процесса.

В конце процесса вы можете уведомить пользователя по электронной почте/телефону/смс.

0

Является ли процесс партии асинхронным? Если нет, вам нужно будет запустить его в другом потоке. Пример:

class BatchController { 

    def batchExecutionService // has the logic to run the batch operation 

    // this should probably only take POST requests, but that's left as a later exercise 
    def execute = { 

     def batchId 

     new Thread(new Runnable() { 
      batchExecutionService.executeBatch(batchId, params) 
     }).start() 

     render batchId // could also set response status to 202 Accepted 
    } 

    def check = { 
     render batchExecutionService.getStatus(params.batchId) 
    } 

    def retrieve = { 
     if(batchExecutionService.getStatus() != Status.FINISHED) { 
      // error response, could be 404 if report is not created yet, or something else 
     } 
     render batchExecutionService.getReport(params.batchId) 
    } 
} 

Вышеупомянутая реализация довольно грубая, но передает общее сообщение. Пара отмечает на нем:

  • Вы, вероятно, не хотели бы просто новым вверх Thread и использовать его, есть лучшие способы сделать это (но дадут более сложный пример). Возможным решением может быть плагин BackgroundThread или плагин Quartz.
  • Возможно, действие execute не должно принимать запросы GET с параметрами запроса, такими как вы сейчас делаете. Но это совсем другое обсуждение. См. this для справки.
Смежные вопросы