2015-12-21 13 views
5

Mam aplikację, która zasadniczo wywołuje wiele usług sieciowych, przechowuje dane otrzymane z tych usług i renderuje je użytkownikowi. Mam zadanie asynchronicznej, które nazywamy wszystkie webservices i wygląda to mniej więcej tak:Błąd podczas operacji scalania po wykonaniu zadania asynchronicznego

List<Promise> t = new ArrayList<Promise>() 
def TIMEOUT_TIME = 6 

    t[0] = task { 
     def responseFrom0 = webserviceRequestService.getResponse(0) 
     if(responseFrom0){ 
      return responseFrom0 
     } 
    } 

    t[1] = task { 
     def responseFrom1 = webserviceRequestService.getResponse(1) 
     if(responseFrom1){ 
      return responseFrom1 
     } 
    } 

getResponse akcja wygląda mniej więcej tak:

List<ResponseResult> result = new ArrayList<TravelQuote>() 

    try { 
     wsClient = prepareRequestMap() 
     wsResponse = externalWebservice.getQuotes(wsClient) 
     wsResponse.responseList.each { 
      ResponseResult responseResult = new ResponseResult() 

      //populate properties of ResponseResult 
      responseResult.save(failOnError:true, flush:true) 
      result.add(responseResult) 

     } 

    } catch(Exception e){ 
     log.error e.message 
     e.printStackTrace() 
    } 

    return result 

I na koniec, mam zebrać wszystkie odpowiedzi od wszystkie usługi sieciowe, takie jak ten:

result.each { 
     if(it){ 
      try{ 
       it=it.merge()          
      }catch (Exception e){ 
       log.error("Error occured while merging responses... : ${e.message}") 
      } 

     } 
    } 

teraz problemem jest tu otrzymuję ten wyjątek od ostatniego bloku kodu

Właściwość not-null odwołuje się do wartości pustej lub przejściowej: ResponseResult.dateCreated; Zagnieżdżony wyjątek to org.hibernate.PropertyValueException: właściwość not-null odwołuje się do wartości pustej lub przejściowej: ResponseResult.dateCreated

Obiekt dateCreated pochodzi z tej klasy, którą zaimplementowałem we wszystkich moich klasach domeny.

abstract class AbstractPersistentObject implements Serializable{ 
    static final long serialVersionUID = 1L;  
    Date dateCreated 
    Date lastUpdated  
} 

Najdziwniejsze o tym problemie jest to dzieje się tylko w środowisku produkcyjnym, bez względu na to, co robię, to nie może replikować w innych środowiskach. A także, gdy to nastąpi, serwer po prostu wyrzuca ten konkretny problem za każdym razem, gdy ten kod jest uruchamiany, dopóki serwer nie zostanie zrestartowany. Po ponownym uruchomieniu ten kod działa poprawnie.

Brakuje mi pomysłów, ktoś ma jakieś pomysły?

+0

Czy nie lepiej oddzielić DTO od klas Domain, które zapisujesz? Co się stanie, jeśli zapiszesz domenę, która nie implementuje Serializable? –

+0

Czy próbowałeś wymusić włączenie funkcji autoTimestamp, dodając parametr 'autoTimestamp true' do bloku mapowania w każdej konkretnej klasie domeny? –

+0

Próbowałem przypisać dateCreated bezpośrednio przez wykonanie, responseResult.dateCreated = new Date(), po wykonaniu tego, dostałem komunikat o błędzie, że nie można znaleźć pustej właściwości 'id' –

Odpowiedz

2

Wydaje się, że odpowiedź dotyczy wyjątku: zewnętrzna usługa internetowa zwraca rekord (y) bez wartości dla pola dateCreated.

Z mojego doświadczenia wynika, że ​​dane ze środowisk produkcyjnych prawie zawsze zawierają brakujące lub nieprawidłowo sformatowane wartości. Powinieneś to wyjaśnić, zmieniając definicję ResponseResult.dateCreated, aby umożliwić wartości null i obsłużyć ten scenariusz w kodzie.

+0

Odpowiedź usługi internetowej nie ustawiona dateCreated, jest ustawiona automatycznie tuż przed wstawieniem rekordu przez klasę AbstractPersistentObject, próbowałem również ustawić go ręcznie, ale otrzymałem ten sam błąd dla pola id. –

Powiązane problemy