我试图找出如何启动JavaExec任务,该任务生成Jetty服务器而不会阻塞后续任务.此外,我将需要在构建完成后终止此服务器.知道我怎么能这样做吗?
我知道这个线程是 2011 年的,但我仍然偶然发现了这个问题。所以这是一个适用于 Gradle 2.14 的解决方案:
import java.util.concurrent.Callable
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class RunAsyncTask extends DefaultTask {
String taskToExecute = '<YourTask>'
@TaskAction
def startAsync() {
ExecutorService es = Executors.newSingleThreadExecutor()
es.submit({taskToExecute.execute()} as Callable)
}
}
task runRegistry(type: RunAsyncTask, dependsOn: build){
taskToExecute = '<NameOfYourTaskHere>'
}
Run Code Online (Sandbox Code Playgroud)
希望这段代码能让您了解如何完成它。
您可以使用构建侦听器闭包在构建开始/结束时运行代码。然而,由于某种原因,gradle.buildStarted闭包在 Milestone-3 中不起作用,因此我将其替换为gradle.taskGraph.whenReady有效的方法。
然后,您可以runJetty使用调用该任务Task#execute()(请注意,此 API 不是官方的,可能会消失),此外,还可以从 an 运行它ExecutorService以获得一些异步行为。
import java.util.concurrent.*
task myTask << {
println "Do usual tasks here"
}
task runJetty << {
print "Pretend we are running Jetty ..."
while(!stopJetty){
Thread.sleep(100)
}
println "Jetty Stopped."
}
stopJetty = false
es = Executors.newSingleThreadExecutor()
jettyFuture = null
//gradle.buildStarted { ... }
gradle.taskGraph.whenReady { g ->
jettyFuture = es.submit({ runJetty.execute() } as Callable)
}
gradle.buildFinished {
println "Stopping Jetty ... "
stopJetty = true
//This is optional. Could be useful when debugging.
try{
jettyFuture?.get()
}catch(ExecutionException e){
println "Error during Jetty execution: "
e.printStackTrace()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8247 次 |
| 最近记录: |