Sto cercando di capire come avviare un'attività JavaExec che genera un server Jetty senza bloccare le attività successive. Inoltre, avrò bisogno di terminare questo server al termine della compilazione. Qualche idea su come posso fare questo?Esegui attività JavaExec in background e termina al completamento della build
risposta
Spero che questo frammento possa darti un'idea di come può essere fatto.
È possibile utilizzare le chiusure di listener per eseguire il codice all'avvio/finitura della build. Tuttavia, per qualche motivo, la chiusura gradle.buildStarted
non funziona in milestone-3, quindi l'ho sostituita con gradle.taskGraph.whenReady
che fa il trucco.
quindi è possibile chiamare il compito runJetty
utilizzando Task#execute()
(Nota, questa API non è ufficiale e può scomparire), e inoltre, eseguirlo da un ExecutorService
per ottenere qualche comportamento asincrono.
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()
}
}
Non è possibile farlo con JavaExec
; dovrai scrivere il tuo compito.
E 'un peccato che questo compito non è più flessibile. Esistono piani per consentire alle attività di JavaExec di eseguire processi JVM in background? –
Sono abbastanza sicuro che ci sia un problema per questo. Le richieste di pull sono benvenute. –
So che il filo è dal 2011, ma ho ancora imbattuto nel problema. Quindi, ecco una soluzione di lavoro con 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>'
}
Ho aggiornato la soluzione da @chrishuen perché non si può chiamare eseguire sul compito più. Qui funziona il mio 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. Esegui attività in background in JavaFX
- 2. Esegui attività in background in Javascript
- 3. Esegui attività di build Android in attività personalizzate
- 4. Attività e accesso in background al database SQLite
- 5. Termina attività principale e corrente in Android
- 6. Esegui attività in background ma restituisce risposta al client nell'applicazione Web ASP MVC
- 7. esegui file bat in background
- 8. Esegui attività ant in jvm
- 9. Esegui alcune attività in IPython Notebook in modalità distaccata
- 10. completamento attività
- 11. Heroku sedici attività in background
- 12. Esegui processo in background in Android
- 13. Debug delle attività in background
- 14. attività di background java
- 15. Avvia nuova attività e termina quella corrente in Android?
- 16. R Lucido - Attività in background continua
- 17. "build automatically" e esegui il test in Eclipse
- 18. Completamento attività iPhone
- 19. Esegui Jupyter Notebook in Background su Docker
- 20. Esegui processi in background con beanstalk elastico
- 21. Simulazione di attività in background su AppHarbor
- 22. Come posso coordinare due attività in background?
- 23. Avvio delle attività in background con Capistrano
- 24. Esegui attività in più thread su node.js
- 25. Esegui attività gradle su sottoprogetti
- 26. Gulp: Esegui attività senza una meta
- 27. Gradle Android - Esegui l'override delle attività standard
- 28. Esegui applicazione Android dall'ultima attività
- 29. iOS5.1: sincronizzazione delle attività (attendere il completamento)
- 30. Affidabile attività in background ripetuta su Android
Sfortunatamente, il plugin jetty per gradle non è molto utile per configurazioni che non sono semplici come sembra. Quindi, sto escludendo l'uso di questo per il mio progetto. Attualmente, posso avviare il mio jetty server molto facilmente da Java e non riesco a farlo facilmente dal plugin gradle senza fare confusione con XML. Io davvero non voglio farlo. –