【问题标题】:run something async in Grails 2.3在 Grails 2.3 中运行一些异步的东西
【发布时间】:2014-08-12 18:46:32
【问题描述】:

在我的 Grails 服务中,我希望异步运行方法的一部分。

以下是 2.3.x http://grails.org/doc/2.3.0.M1/guide/async.html 的文档

我愿意

public class MyService {
    public void myMethod() {
        Promise p = task {
            // Long running task
        }
        p.onError { Throwable err ->
            println "An error occured ${err.message}"
        }
        p.onComplete { result ->
            println "Promise returned $result"
        }
        // block until result is called
        def result = p.get()
    }
}

但是,我想在没有任何阻塞的情况下执行我的。 p.get() 方法阻塞。如何在没有任何阻塞的情况下执行承诺。我不在乎myMethod() 是否返回,这是一种“一劳永逸”的方法。

【问题讨论】:

    标签: grails asynchronous


    【解决方案1】:

    因此,根据documentation,如果您不调用.get().waitAll() 而只是使用onComplete,您可以在不阻塞当前线程的情况下运行您的任务。

    这是一个非常愚蠢的示例,我在控制台中将其作为概念证明。

    import static grails.async.Promises.*
    def p = task {
        // Long running task
        println 'Off to do something now ...'
        Thread.sleep(5000)
        println '... that took 5 seconds'
        return 'the result'
    }
    
    p.onError { Throwable err ->
        println "An error occured ${err.message}"
    }
    p.onComplete { result ->
        println "Promise returned $result"
    }
    
    println 'Just to show some output, and prove the task is running in the background.'
    

    运行上面的例子会得到以下输出:

    Off to do something now ...  
    Just to show some output, and prove the task is running in the background.  
    ... that took 5 seconds   
    Promise returned the result
    

    【讨论】:

    • 我无法让它工作。当我定义 onError 时,我总是得到以下异常。 org.grails.async.factory.gpars.LoggingPoolFactory 错误异步执行错误:在 groovyx.gpars 的 org.grails.async.factory.gpars.GparsPromise$_onError_closure2.doCall(GparsPromise.groovy:72) 处的 null java.lang.NullPointerException。 dataflow.DataCallback$1.run(DataCallback.java:62) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
    • @wheels53 你找到这个 NPE 的解决方案了吗?当我定义 onError 时,我也一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多