Fehler beim asynchronen Job

9

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%     
agusluc 16.09.2014, 20:53
quelle

3 Antworten

3

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: Ссылка

    
agusluc 28.11.2014, 13:59
quelle
1

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:

%Vor%

Das macht Ihren Code lesbarer:

%Vor%     
pyb 27.08.2015 23:23
quelle
0

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%

Vor dem Aufruf von render wird das Problem behoben.

    
blacktide 16.09.2014 23:36
quelle

Tags und Links