Запустить что-то async в Grails 2.3

В службе My 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(), это своего рода способ стрельбы и забывания.

Ответ 1

Итак, согласно документации, если вы не вызываете .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