我想弄清楚如何启动派生Jetty服务器而不阻塞后续任务的JavaExec任务。此外,我将需要在构建完成后终止此服务器。任何想法我怎么能做到这一点?在后台运行JavaExec任务,然后在构建完成时终止
回答
希望这段代码能给你一些关于它如何完成的见解。
您可以使用构建侦听器闭包在构建开始/结束时运行代码。但是,由于某种原因,gradle.buildStarted
关闭在里程碑-3中不起作用,所以我用gradle.taskGraph.whenReady
取代了它,这有诀窍。
然后就可以调用使用Task#execute()
的runJetty
任务(注意,这个API是不是官方的,并可能会消失),另外,从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()
}
}
你不能这样做JavaExec
;你将不得不编写自己的任务。
不幸的是,这个任务不是更灵活。是否有计划允许JavaExec任务执行后台JVM进程? –
我很确定这是一个问题。拉请求是受欢迎的。 –
我知道线程是从2011年开始的,但我仍然偶然发现了这个问题。因此,这里是用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>'
}
我更新从@chrishuen解决方案,因为你不能调用任务执行了。这是我的工作build.gradle
import java.time.LocalDateTime
import java.util.concurrent.Callable
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
group 'sk.bsmk'
version '1.0-SNAPSHOT'
apply plugin: 'java'
task wrapper(type: Wrapper) {
gradleVersion = '3.4'
}
class RunAsyncTask extends DefaultTask {
@TaskAction
def startAsync() {
ExecutorService es = Executors.newSingleThreadExecutor()
es.submit({
project.javaexec {
classpath = project.sourceSets.main.runtimeClasspath
main = "Main"
}
} as Callable)
}
}
task helloAsync(type: RunAsyncTask, dependsOn: compileJava) {
doLast {
println LocalDateTime.now().toString() + 'sleeping'
sleep(2 * 1000)
}
}
- 1. Rake任务用于在独立线程中运行服务器,然后在任务完成时终止线程?
- 2. 运行后台任务,然后是GUI
- 3. 等待任务完成,然后终止ScheduledThreadPoolExecutor
- 4. 在后台运行代码,然后更新UI完成
- 5. Libssh2:防止后台任务被终止
- 6. 运行一个后台进程,然后在中间处理后终止它
- 7. Android:始终在后台运行服务?
- 8. 创建一个完成后运行任务的任务计划
- 9. 在后台运行任务以防止504网关超时
- 10. iPhone后台任务在某个时间点停止运行
- 11. 在其他几项任务完成后运行任务
- 12. 查询在完成后仍然运行
- 13. 后台任务只运行
- 14. 后台任务将在下次启动时终止
- 15. 构建完成后运行后构建过程
- 16. 当应用程序终止时执行后台任务
- 17. 创建一个始终运行的后台任务
- 18. 后台任务不在UWP中运行
- 19. 在后台运行任务iOS
- 20. 定期在后台运行任务
- 21. 在laravel 4.2后台运行任务
- 22. Workling未在后台运行任务
- 23. 后台长时间运行的任务
- 24. 启动后台脚本运行任务,然后退出它
- 25. 在完成后台任务后重新获得焦点
- 26. 如何在后台完成任务后显示弹出窗口?
- 27. 在后台执行任务
- 28. 当任务不在AppDelegate中时,我如何在后台完成任务?
- 29. iOS的后台任务完成编程
- 30. 后台任务完成自发#с
不幸的是,gradle的jetty插件对于看起来并不简单的设置来说并不是非常有用。所以,我排除了这个用于我的项目。目前,我可以很容易地从Java启动我的jetty服务器,并且我不能轻易地从gradle插件执行此操作,而不会搞乱XML。我真的不想那样做。 –