grails 2.3.x 异步和 sleep

标签 grails asynchronous sleep gpars

我使用 grails 2.3.x 和 async 时遇到了一些奇怪的行为。我正在用这段代码做一些测试:

def test1() {
    def list = new PromiseList()
    list << {
        Thread.sleep(1000)
        println "1"
        return "1"
    }
    list << {
        Thread.sleep(2000)
        println "2"
        return "2"
    }
    list << {
        Thread.sleep(3000)
        println "3"
        return  "3"
    }
    list.onComplete { List results ->
        println 'finished: '+results
    }
    list.onError { error ->
        error.printStackTrace()
    }
    render 'finish'
}

但在我的日志中我得到:

1
| Error java.lang.NullPointerException
| Error     at org.apache.catalina.connector.Request.notifyAttributeAssigned(Request.java:1565)
| Error     at org.apache.catalina.connector.Request.setAttribute(Request.java:1556)
| Error     at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:543) 
| Error     at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
| Error     at org.codehaus.groovy.grails.web.util.WebUtils.storeGrailsWebRequest(WebUtils.java:682)
| Error     at org.codehaus.groovy.grails.plugins.web.async.WebRequestPromsiseDecorator$_decorate_closure1.doCall(WebRequestPromiseDecoratorLookupStrategy.groovy:61)
| Error     at sun.reflect.GeneratedMethodAccessor283.invoke(Unknown Source)
| Error     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
| Error     at java.lang.reflect.Method.invoke(Method.java:606)
| Error     at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1260)
| Error     at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
| Error     at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
| Error     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1086)
| Error     at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1110)
| Error     at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:910)
| Error     at groovy.lang.Closure.call(Closure.java:411)
| Error     at groovy.lang.Closure.call(Closure.java:405)
| Error     at groovyx.gpars.group.PGroup$3.call(PGroup.java:287)
| Error     at groovyx.gpars.group.PGroup$4.run(PGroup.java:311)
| Error     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
| Error     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
| Error     at java.lang.Thread.run(Thread.java:724)
2
3

事实上,任务(和 onError 闭包)被执行,但 onComplete 没有(当然)!!

我做错了什么?

除了 Thread.sleep() 之外,实际上代码取自文档:http://grails.org/doc/latest/guide/async.html

Thread.sleep() 是否由于某种原因与 GPar 不兼容?

最佳答案

问题是 onComplete 不会阻塞。请求/操作确实在您的任务和 list 超出范围之前完成。

您需要使用 waitAll() 等待所有任务完成,然后操作才会返回。最简单的方法是将 onComplete 替换为

    def result = list.get ()
    println 'finished: ' + result

list.get()是通过调用waitAll()实现的。

关于grails 2.3.x 异步和 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428669/

相关文章:

c++ - 我如何在 C++ 中使用异步函数?

sleep - 有谁知道如何在操作系统进入休眠模式时修改/禁用闪烁的电源 LED?

java - 如果事务回滚,CompassGps 会回滚吗?

hibernate - HQL:基于属性值的最大/极限结果

python - Python线程,排队,异步……这是什么意思?

python - 多线程 python 应用程序在运行其线程时挂起

javascript - 实现 sleep 功能 JavaScript 的最佳方式是什么?

hibernate - 如何使用 Grails 3.0.1 和 Hibernate 创建具有默认架构的表?

spring - Grails 4.0.1 - MessageSource 注入(inject)和使用方法获取消息给出空指针异常错误

javascript - 如果将脚本动态添加到 DOM, "async"属性/属性是否有用?