2010-10-22 39 views
1

我正在構建一個研究Web應用程序,該應用程序運行可以持續數小時的長批量分析。 我正在使用Grails但我認爲這是一個普遍的設計問題。批處理可以由URL開始,例如,從網絡界面運行長時間的實驗

http://mydomain/experiment/run?a_lot_of_params

而這個頁面返回有關實驗(其數據存儲在後端,並通過另一個網絡接口訪問)的信息。 例如

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

這種方法的問題是:如果實驗持續幾分鐘,則可以保留網頁等待。但是如果實驗持續10小時會發生什麼?如果用戶關閉該頁面怎麼辦? 在這種情況下是否有正確的設計模式?

感謝您的任何提示。

+0

你最終做了什麼? – 2011-06-14 05:40:28

回答

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以供參考。