2014-04-29 16 views
5

Używam asynchronicznego renderowania Servlet 3.0 w mojej aplikacji Grails. I pojawia się następujący błąd.Programowanie asynchroniczne w 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 

Proszę mi pomóc rozwiązać ten problem.

Oto kod

//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

Możesz pisać kod, który jest zepsuty? –

+0

Spróbuj określić wartość zwracaną w metodach onComplete (np. Wynik String-> ... w twoim przypadku) i sprawdź, czy to pomaga. –

+0

Cześć Raanan, zdefiniowałem wartość zwracaną w metodzie onComplete, o czym wspomniałeś. Ale nadal problem nadal występuje. Błąd nadchodzi, ale nie jest częsty. Jeśli uruchomię jakieś 20 lub 30 razy, gdy napotkam błąd. Czy możesz mi pomóc? –

Odpowiedz

2

Trzeba dodać to po linie na dole kodzie:

p1.get() 
p2.get() 

To będzie blokować żądania aż obie obietnice są kompletne. Jeśli chcesz uruchomić zadania asynchroniczne i zakończyć żądanie bez synchronicznego oczekiwania na odpowiedź, musisz użyć struktury executora języka Java. Zaznacz to pytanie: Error on async job