Grails 异步响应渲染是如何工作的?

Posted

技术标签:

【中文标题】Grails 异步响应渲染是如何工作的?【英文标题】:How does Grails async response rendering work? 【发布时间】:2016-04-13 13:10:02 【问题描述】:

我在 grails 控制器中有一个代码 sn-p,如下所示:

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)

当我遇到Grails Async Response Rendering 时,我意识到future1.getfuture2.get 正在阻塞调用并想让它们异步

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

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】:

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

【讨论】:

请在此答案中包含相关信息。 嗨,Alexei,你是对的,我会的。实际上,我仍在对异步处理中的 gremlins 进行故障排除,其中存储在会话中的属性在调用异步处理的控制器操作时会消失。我想至少链接一个可以进一步阐明的帖子(除了文档)。

以上是关于Grails 异步响应渲染是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 grails 中使用渲染插件

从 Grails 中的控制器渲染 json 视图

Groovy Grails,如何在控制器的响应中流式传输或缓冲大文件?

Grails - 从 Javascript 方法调用控制器和渲染模板

从 Grails RestfulController 索引/搜索操作中渲染元数据以进行分页

Grails文件上传:视图渲染时如何设置输入文件的值