Die Verwaltung von threads in Grails-Services
Also ich habe einen service eingerichtet importieren eine große Menge von Daten aus einer Datei, die der Benutzer hochlädt. Ich möchte die Benutzer in der Lage sein, weiter zu arbeiten auf der Website, während die Datei verarbeitet wird. Ich erreichte dies durch die Erstellung eines Threads.
Thread.start {
//work done here
}
Nun entsteht das problem, dass ich wollen nicht zu haben, mehrere threads gleichzeitig laufen. Hier ist, was ich versucht habe:
class SomeService {
Thread thread = new Thread()
def serviceMethod() {
if (!thread?.isAlive()) {
thread.start {
//Do work here
}
}
}
}
Aber das funktioniert nicht. thread.isAlive()
immer false zurück. Irgendwelche Ideen auf, wie kann ich dies erreichen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde überlegen, einen
Executor
statt.Mit einem
newSingleThreadExecutor
wird sichergestellt, dass tasks eine nach der anderen. Wenn es ein hintergrund-task bereits ausgeführt wird dann die nächste Aufgabe wird sein, in eine Warteschlange gestellt, und gestartet wird, wenn der laufende task beendet hat (serviceMethod
sich immer noch sofort wieder zurück).Möchten Sie vielleicht zu prüfen, die executor plugin, wenn Sie Ihre "Arbeit tun, hier" beinhaltet GORM Datenbank-Zugriff, wie das plugin den entsprechenden Persistenz-Kontext (z.B. Hibernate-session) für Ihre hintergrund-tasks.
withTransaction
sollte es tun (zumindest wenn man auf den Ruhezustand, ich kann nicht sprechen für mongo), aber die executor plugin ist sehr leicht im Gewicht, so würde ich nicht entlassen Sie aus der hand.Einen anderen Weg, dies zu tun ist die Verwendung von Spring
@Async
annotation.Fügen Sie die folgenden
resources.groovy
:Jede service-Methode, die Sie jetzt kommentieren mit
@Async
wird asynchron ausgeführt, z.B.Wenn Sie möchten, dass nur ein thread zum ausführen der import-zu einer Zeit, Sie könnten so etwas tun -