Ich versuche eine asynchrone Aufgabe zu erstellen, die die Anfrage nicht blockiert. Der Benutzer nimmt die Anforderung vor, die Aufgabe wird gestartet, und der Controller gibt "Auftrag läuft ..." aus, um zu vermeiden, dass die Anforderung blockiert wird, während die Task beendet wird. Sobald die Aufgabe abgeschlossen ist, führt sie die onComplete aus und führt etwas mit dem Ergebnis dieser Aufgabe aus (z. B. einen Dienst aufrufen, der eine Mail an einen Benutzer sendet)
%Vor%Der Code ist der folgende:
%Vor%Komplette Stapelverfolgung:
%Vor%Ich habe das Executor-Framework mit dem Grails-Executor-Plugin beendet. Ich habe hier ein sehr einfaches Beispiel hochgeladen: Ссылка
Dieser Code verwendet eine "Custom" -Version des Grails-Executor-Plugins, ich habe einige PRs aus dem Plugin-Repo zusammengefügt und als Jar zum Test von Propuses gepackt. Das Repo des Plugins ist das: Ссылка
Ich konnte diese Ausnahme in einem Controller loswerden, indem ich die Aufrufe onComplete
und onError
löschte. Ich denke, die Ausnahme passiert, weil der Eltern-Thread endete, als Sie render
aufgerufen haben.
Also dein:
%Vor%wird:
%Vor% Dies fügt eine Kopplung zwischen Ihrer Arbeit (1) und der Ergebnisverarbeitung (2 und 3) hinzu, aber Sie könnten dies überwinden, indem Sie Ihren eigenen Closure
-Wrapper schreiben, der zusätzliche Closures als Argumente benötigt. Etwas wie das:
Das macht Ihren Code lesbarer:
%Vor% Beim Erstellen einer asynchronen Promise-Task in einem Controller müssen Sie die Antwort tatsächlich ausgeben, indem Sie die Methode get()
für die Task aufrufen, oder die Methoden onError
und onComplete
werden nie aufgerufen. Hinzufügen:
Vor dem Aufruf von render
wird das Problem behoben.