从Web界面运行长时间的实验

时间:2010-10-22 11:25:47

标签: design-patterns grails web-applications

我正在构建一个研究网络应用程序,该应用程序运行可持续数小时的长批量分析。 我正在使用 Grails ,但我认为这是一个一般性的设计问题。 批处理过程可以通过URL启动,例如

http://mydomain/experiment/run?a_lot_of_params

此页面返回有关实验的信息(其数据存储在后端,可通过其他Web界面访问)。 例如

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

这种方法的问题是:如果实验持续几分钟,可以让网页等待。但如果实验持续10个小时会发生什么?如果用户关闭页面怎么办? 对于这种情况,是否有正确的设计模式?

感谢任何提示。

2 个答案:

答案 0 :(得分:2)

您可以为用户提供一个令牌,并让他们输入该令牌以查看该过程的状态。

在流程结束时,您可以通过电子邮件/电话/短信通知用户。

答案 1 :(得分: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以获取参考。