我的grails应用程序中有一个动作,我想在调用动作时启动一个异步方法。我正在尝试使用promises来做到这一点,但似乎task1以同步方式运行。有人知道如何让这个task1在动作收集器的同时以异步方式(并发地)进行处理吗?
def collector(){
try{
Promise task1 = task {
println "task1 - starting"
console() //call another method
println "task1 - ending"
}
//do something
...
}catch(){
....
}
答案 0 :(得分:2)
使用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"
}
答案 1 :(得分:0)
异步运行代码片段的三种方法
<强> A 即可。使用线程
def mytask={println "3.hello"}
println "1.begin"
new Thread( {
mytask();
}).start()
println "2.end"
输出:
1.begin
2.end
3.hello
<强>乙即可。使用事件
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
}
输出:
开始
结束
消息