2014-04-29 6 views
5

Ich benutze Servlet 3.0 Asynchronous Rendering in meiner Grails-Anwendung. Und ich erhalte folgenden Fehler.Asynchrone Programmierung in Grails

| Error 2014-04-29 11:10:24,125 [Actor Thread 28] ERROR gpars.LoggingPoolFactory - Async execution error: null 
Message: null 
    Line | Method 
->> 61 | doCall in org.grails.async.factory.gpars.GparsPromise$_onComplete_closure1 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  62 | run  in groovyx.gpars.dataflow.DataCallback$1 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 615 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 724 | run . . . in java.lang.Thread 

Bitte helfen Sie mir, dieses Problem zu lösen.

Hier ist der Code

//Promise 1 
    Promise p1 = task { 
     println id+" p1 Task is Runing" 
     sleep(4000) 
     println id+" p1 Thread Woke Up" 
     return "p1Completed" 
    } 

    //Promise 2 
    Promise p2 = task { 
     println id+" p2 Task is Runing"  
     sleep(4000) 
     println id+" p2 Thread Woke Up" 
     return "p2Completed" 
    } 
    p1.onComplete { result -> 
     println id+" Promise p1 Completed returned "+result 
    } 
    p1.onError { Throwable err -> 
     println id+" p1 An error occured ${err.message}" 
    } 
    p2.onComplete { result -> 
     println id+" Promise p2 Completed returned "+result 
    } 
    p2.onError { Throwable err -> 
     println id+" p2 An error occured ${err.message}" 
    } 
+2

Können Sie den fehlerhaften Code buchen? –

+0

Versuchen Sie, den Rückgabewert in den onComplete-Methoden (d. H. String result-> ... in Ihrem Fall) zu definieren, und sehen Sie, ob es hilft. –

+0

Hallo Raanan, ich habe den Rückgabewert in der onComplete-Methode definiert, wie Sie erwähnt haben. Aber das Problem bleibt bestehen. Der Fehler kommt, aber nicht häufig. Wenn ich etwa 20 oder 30 mal laufe, stoße ich auf den Fehler. Können Sie bitte helfen. –

Antwort

2

Sie müssen diese Zeilen nach dem an der Unterseite des Codes hinzuzufügen:

p1.get() 
p2.get() 

Dies wird die Anfrage blockiert, bis beide Versprechen abgeschlossen sind. Wenn Sie die asynchronen Tasks ausführen und die Anforderung beenden möchten, ohne synchron auf die Antwort zu warten, müssen Sie das Java-Executor-Framework verwenden. Überprüfen Sie diese Frage: Error on async job