Tôi đang cố gắng tìm ra cách khởi chạy tác vụ JavaExec để sinh ra một máy chủ Jetty mà không chặn các tác vụ tiếp theo. Ngoài ra, tôi sẽ cần phải chấm dứt máy chủ này sau khi xây dựng hoàn thành. Bất kỳ ý tưởng làm thế nào tôi có thể làm điều này?Chạy tác vụ JavaExec ở chế độ nền và sau đó chấm dứt khi xây dựng hoàn thành
Trả lời
Hy vọng đoạn mã này sẽ cung cấp cho bạn một số thông tin chi tiết về cách thực hiện.
Bạn có thể sử dụng đóng trình nghe xây dựng để chạy mã khi bắt đầu/kết thúc xây dựng. Tuy nhiên, vì một lý do nào đó, việc đóng cửa gradle.buildStarted
không hoạt động trong cột mốc-3, vì vậy tôi đã thay thế nó bằng gradle.taskGraph.whenReady
.
Sau đó, bạn có thể gọi nhiệm vụ runJetty
bằng cách sử dụng Task#execute()
(Lưu ý, API này không chính thức và có thể biến mất), và bổ sung, chạy nó từ ExecutorService
để nhận một số hành vi không đồng bộ.
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()
}
}
Bạn không thể làm điều đó với JavaExec
; bạn sẽ phải viết nhiệm vụ của riêng bạn.
Thật không may là nhiệm vụ này không linh hoạt hơn. Có bất kỳ kế hoạch nào để cho phép các tác vụ JavaExec thực thi các quy trình JVM nền không? –
Tôi chắc chắn có vấn đề với nó. Yêu cầu kéo được hoan nghênh. –
Tôi biết chủ đề là từ năm 2011, nhưng tôi vẫn tình cờ gặp vấn đề. Vì vậy, đây là giải pháp hoạt động với 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>'
}
Tôi đã cập nhật giải pháp từ @chrishuen vì bạn không thể thực hiện nhiệm vụ được nữa. Đây là hoạt động của tôi 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. Thực hiện tác vụ ở chế độ nền trong JavaFX
- 2. Chạy tác vụ ở chế độ nền với mức ưu tiên CPU thấp hơn
- 3. MPMusicPlayerController: iPod dừng gửi thông báo, khi ứng dụng iPod bị chấm dứt ở chế độ nền
- 4. Hoàn tác xây dựng thành macro VBA Excel
- 5. Chấm dứt chương trình jQuery/JavaScript sau khi số hoàn thành được thay đổi
- 6. cách chạy ứng dụng android phonegap ở chế độ nền (sau khi đóng ứng dụng)?
- 7. Lập lịch nhiệm vụ ứng dụng iOS để chạy trong khi ở chế độ nền
- 8. Chương trình Java chạy ở chế độ nền
- 9. Chạy ứng dụng/dịch vụ ở chế độ ngủ sâu?
- 10. JavaFX - đang đợi tác vụ hoàn thành
- 11. Có thể hoàn thành được gọi sau khi một nhà xây dựng ném một ngoại lệ?
- 12. Rails + XMPP bot ở chế độ nền
- 13. Subprocess hoàn thành nhưng vẫn không chấm dứt, gây deadlock
- 14. Làm cho hoạt động chạy ở chế độ nền
- 15. NSTimer dừng ở chế độ nền sau một thời gian
- 16. Chạy máy chủ Webrick ở chế độ nền?
- 17. Quá trình chạy ở chế độ nền trong Android
- 18. Dấu chấm phẩy XCode sau khi tự động hoàn thành
- 19. Chạy một nhiệm vụ sau khi tất cả các nhiệm vụ đã được hoàn thành
- 20. Cách chạy hoạt động ở chế độ nền trong Android
- 21. Gọi các Tác vụ khác ngoài Xây dựng và Làm sạch & Xây dựng
- 22. giữ ứng dụng đang chạy ở chế độ nền
- 23. Thêm dịch vụ sau khi container đã được xây dựng
- 24. Chạy trình nghe GPS ở chế độ nền trên Android
- 25. iphone - NSTimers ở chế độ nền
- 26. Omniauth và open_id với Google bị hỏng khi chạy sau nginx ở chế độ SSL
- 27. tác vụ nền java
- 28. chạy lệnh bash pipe ở chế độ nền với & ampersand
- 29. Ứng dụng đang chạy ở chế độ nền
- 30. AngularJs: Chạy Chỉ thị sau khi Chế độ xem được hiển thị hoàn toàn
Thật không may, các plugin cầu nối cho gradle không phải là terribly hữu ích cho các thiết lập mà không phải là bẩn đơn giản có vẻ như. Vì vậy, tôi quyết định sử dụng điều này cho dự án của tôi. Hiện tại, tôi có thể khởi động máy chủ jetty của tôi rất dễ dàng từ Java và tôi không thể dễ dàng làm điều này từ plugin gradle mà không gây rối với XML. Tôi thực sự không muốn làm điều đó. –