2016-03-25 15 views
5

Piszę klienta dla odpoczynku API przy użyciu biblioteki http akka. Biblioteka wydaje się bardzo potężna, ale działa dla mnie bardzo niestabilnie. Dość często (nie zawsze) rzuca następujący wyjątek, gdy próbuję zużywają HttpResponse.entity:Akka http wyrzuca EntityStreamException: Obcinanie strumienia jednostki

EntityStreamException: PODMIOT strumienia obcinanie

a potem zatrzymuje przetwarzanie kolejnych żądań w ogóle. Może próbuje poradzić sobie z presją lub aktorzy po prostu umierają, nie wiem.

To nie ma znaczenia, w jaki sposób mogę wysłać żądanie, używając wniosek szczebla po stronie klienta API:

def pollSearchResult(searchId: String): FutureActionResult[String, SearchResult] = { 
    val request = HttpRequest(GET, s"http://***/Search/$searchId") 

    for { 
     response <- Http().singleRequest(request) 
     entity <- Unmarshal(response.entity).to[String] 
     result = entity.decodeEither[SearchResult] 
    } yield result 
    } 

lub używając poziomie połączenia po stronie klienta API:

val client = Http(actorSystem).outgoingConnection("***") 

def pollSearchResult(searchId: String): FutureActionResult[String, SearchResult] = { 
    val request = HttpRequest(GET, s"Search/$searchId") 

    for { 
     response <- Source.single(request).via(client).runWith(Sink.head) 
     entity <- Unmarshal(response.entity).to[String] 
     result = entity.decodeEither[SearchResult] 
     } yield result 
    } 

Nie ma wpływu na to, czy zajmuję się jednostką przy użyciu unmarshaller, czy ręcznie, używając getDataBytes, wynik jest taki sam - powyższy wyjątek.

Status http odpowiedzi wynosi 200 OK, nagłówki są w porządku, jest to element "domyślny" (czyli brak fragmentów), długość zawartości wynosi około 500-2000 kb (zwiększenie akka.http.parsing.max- długość treści nie pomaga, chociaż wartość domyślna powinna wystarczyć). Serwer też jest ok - inne biblioteki http na innych platformach działają z tym API po prostu dobrze.

Czy to błąd, czy robię coś nie tak? Jaka jest najlepsza nie blokująca, asycnhonous biblioteka http dla scala?

+0

** Jaka jest najlepsza nie blokująca, asycnhoniczna biblioteka http dla scala? ** Och, chłopcze, jeśli to wymyślisz, daj mi znać. Właśnie rozpoczęliśmy używanie akka http i widzę ten sam błąd z dokładnym zachowaniem, które widzisz. Maksymalna długość treści nie pomaga. Wydaje mi się, że zawęziłem to do rozmiaru treści, ponieważ po wysłaniu pewnej ilości danych zaczyna się to dziać. Wszystko działa zgodnie z przeznaczeniem przy mniejszych żądaniach. – haggy

+0

* Aktualizacja: * Udało mi się zweryfikować, że nie ma to nic wspólnego z danymi, które wysyłałem. Zamiast wysyłać 1 duże żądanie wsadowe, dzielę je na wiele małych (przy użyciu tego samego interfejsu API) i pomyślnie przeszło. To zdecydowanie sprawia, że ​​wydaje się, że istnieje nieodłączny limit danych lub coś, co powoduje problemy z przepływem przy większych żądaniach. – haggy

+0

* Zaktualizuj ponownie: * Udało mi się rozwiązać mój problem. To był problem ze ścieżką routingu (tak, poważnie). Miałem zagnieżdżoną trasę, która w jakiś sposób kolidowała z inną trasą na tym samym poziomie. Raz przepracowałem strukturę tras, wszystko działało dobrze. – haggy

Odpowiedz

0

Mam uwagi na temat pytania początkowego, ale także udzielam odpowiedzi, aby można było go zatwierdzić na wypadek, gdyby to pomogło komukolwiek.

To był problem z trasą trasy (tak, poważnie). Miałem zagnieżdżoną trasę, która w jakiś sposób kolidowała z inną trasą na tym samym poziomie (w zasadzie istniała dziwaczność powodująca, że ​​jedna droga zastąpiła inną ...). Raz przepracowałem strukturę tras, wszystko działało dobrze.

+0

Jak masz na myśli dziwny konflikt? Nie widzę niczego dziwnego w moich trasach, jednak często otrzymuję ten sam błąd (choć nie we wszystkich żądaniach). – Alex

Powiązane problemy