在grails中创建并发线程/承诺

时间:2017-04-13 12:12:50

标签: java multithreading groovy promise task

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

def collector(){

    try{

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

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

2 个答案:

答案 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
}

输出:

  

开始

     

结束

     

消息