在 grails 中创建并发 thread/promise

Create concurrent thread/promise in grails

我的 grails 应用程序中有一个动作,我想在调用该动作时启动一个异步方法。我正在尝试使用承诺来做到这一点,但似乎 task1 运行s syschronously。有人知道我如何使这个任务 1 运行 异步(并发)在动作收集器的同时进行处理吗?

def collector(){

    try{

        Promise task1 = task {
            println "task1 - starting"
            console() //call another method
            println "task1 - ending"
        }

        //do something
        ...
    }catch(){
       ....
    }

三种方式运行异步代码片段

A。使用线程

def mytask={println "3.hello"}
println "1.begin"
 new Thread( {
         mytask();
    }).start() 
println "2.end"

输出:

1.begin

2.end

3.hello

B。使用事件

 import grails.events.Events
 
 @Consumer    
 class Game  implements Events{
    @Selector("play")
    def doPlay(Object msg) {
       println msg.toString()
    }
}

def gameScenarioService 

//send event, will call doPlay method asyncrhonously
notify ( "play", "First Play" )

C。使用 GPars

@Grab(group='org.codehaus.gpars', module='gpars', version='1.2.1')

import groovyx.gpars.actor.DefaultActor
 

class CustomActor extends DefaultActor {
    @Override protected void act() {
        loop {
            react {
                println it
            }
        }
    }
}
println "begin"
def console=new CustomActor()
console.start()

//trigger to react
console.send('Message')
println "end"

sleep(100) {
    // wait Message
}

输出:

begin

end

Message

使用 Grails 3:

import grails.async.Promise
import static grails.async.Promises.task

Promise p = task {
    // do stuff
}
p.onError { Exception err ->
    log.error( "Error during task $err" )
}
p.onComplete {
    log.info "Task completed"
}