我正在构建一个研究网络应用程序,该应用程序运行可持续数小时的长批量分析。 我正在使用 Grails ,但我认为这是一个一般性的设计问题。 批处理过程可以通过URL启动,例如
http://mydomain/experiment/run?a_lot_of_params
此页面返回有关实验的信息(其数据存储在后端,可通过其他Web界面访问)。 例如
Experiment finished: results available at
http://mydomain/experiment/data/myexperiment.xml
这种方法的问题是:如果实验持续几分钟,可以让网页等待。但如果实验持续10个小时会发生什么?如果用户关闭页面怎么办? 对于这种情况,是否有正确的设计模式?
感谢任何提示。
答案 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以获取参考。