Grails异步响应呈现如何工作?

时间:2016-01-08 18:49:39

标签: grails asynchronous promise

我在grails控制器中有一个代码片段,如下所示:

Future<Map<String,Object>> future1 = service.getMetrics(args1)
Future<Map<String,Object>> future2 = service.getMetrics(args2)

Map<String,Object> result1 = future1.get(10, TimeUnit.DAYS.MINUTES)
Map<String,Object> result2 = future2.get(10, TimeUnit.DAYS.MINUTES)

render([
    data1: result1,
    data2: result2
] as JSON)

我意识到future1.getfuture2.get阻止了调用,并希望在我遇到Grails Async Response Rendering

时使它们异步

我现在正在考虑将代码重构为

task {
    Future<Map<String,Object>> future1 = service.getMetrics(args1)
    Future<Map<String,Object>> future2 = service.getMetrics(args2)

    Map<String,Object> result1 = future1.get(10, TimeUnit.DAYS.MINUTES)
    Map<String,Object> result2 = future2.get(10, TimeUnit.DAYS.MINUTES)

    render([
     data1: result1,
     data2: result2
    ] as JSON)    
}

这有效,但我想了解任务是如何工作的以及它如何确保当前线程未在future.get上被阻止,以及它如何呈现正确会话的响应

1 个答案:

答案 0 :(得分:0)

我相信Graeme对他question的答案中的当前文档进一步澄清了这一点。 Graeme链接到类,该类准确显示结果转换器在返回Promise或PromiseMap时如何检测和处理响应。