Grails异步响应呈现与Servlet 3.0异步呈现

时间:2016-03-28 20:17:26

标签: servlets grails asynchronous promise

我在控制器中有一个应该返回JSON的方法。

根据我对grails async docs的解释,在子主题Async Response Rendering下,我可以用任务构造包装我的I / O调用 task{}那应该进行异步响应呈现。

所以我的方法看起来像

def getSomeJSON() { 
    task {
        def someList = someService.getList()
        render([key: someList] as JSON)
    }
}

该方法运行正常,但我看到我的日志有很多错误,说

ERROR o.g.a.f.gpars.LoggingPoolFactory - Async execution error: null
java.lang.NullPointerException: null

我不确定是什么原因造成的。我无法在本地计算机上重现这一点。

所以我的问题是上面的代码片段出了什么问题? 我对该文档的解释是错误的吗?

这与“Servlet 3.0 Asynchronous Rendering”

有什么不同

编辑:

我按如下方式更新了我的方法:

import static grails.async.Promises.*

    def getSomeJSON() { 
            Promise jsonPromise = task {
                def someList = someService.getList()
                render([key: someList] as JSON)
            }
            jsonPromise
        }

因此,我在这里所做的更改是显式地从文档中建议的控制器方法返回Promise。引用文档:

  

这是通过从控制器返回Promise实例来完成的   动作。

但我仍然得到错误:

ERROR o.g.a.f.gpars.LoggingPoolFactory - Async execution error: null
java.lang.NullPointerException: null
    at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1547) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at org.apache.catalina.connector.Request.setAttribute(Request.java:1538) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:541) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:279) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239) ~[tomcat-embed-core-7.0.54.jar:7.0.54]
    at org.codehaus.groovy.grails.web.util.WebUtils.storeGrailsWebRequest(WebUtils.java:431) ~[grails-web-common-2.4.2.jar:2.4.2]
    at org.codehaus.groovy.grails.plugins.web.async.WebRequestPromsiseDecorator$_decorate_closure1.doCall(WebRequestPromiseDecoratorLookupStrategy.groovy:55) ~[grails-plugin-async-2.4.2.jar:2.4.2]
    at org.codehaus.groovy.grails.plugins.web.async.WebRequestPromsiseDecorator$_decorate_closure1.call(WebRequestPromiseDecoratorLookupStrategy.groovy) ~[grails-plugin-async-2.4.2.jar:2.4.2]
    at org.grails.async.factory.gpars.GparsPromise$_onError_closure2.doCall(GparsPromise.groovy:72) ~[grails-async-2.4.2.jar:2.4.2]
    at org.grails.async.factory.gpars.GparsPromise$_onError_closure2.call(GparsPromise.groovy) ~[grails-async-2.4.2.jar:2.4.2]
    at groovyx.gpars.dataflow.DataCallback$1.run(DataCallback.java:62) ~[gpars-1.2.1.jar:1.2.1]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_71]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_71]
    at java.lang.Thread.run(Thread.java:745) ~[na:1.7.0_71]

0 个答案:

没有答案