2016-03-25 16 views
5

Akka http kitaplığını kullanarak bir geri kalan API için istemci yazıyorum. Kütüphane çok güçlü görünüyor, ama benim için çok kararsız çalışıyor. Oldukça sık (her zaman değil) Bir HttpResponse.entity tüketmeye çalışırken aşağıdaki istisna atar:akka http atar EntityStreamException: Varlık akışı kesme

EntityStreamException: Varlık dere kesme

ve bundan sonra da hiç bir sonraki istekleri işlemeyi durdurur. Belki de bazı geri-basınçlarla uğraşmaya çalışır ya da sadece ölürsün, bilmiyorum.

Ben bir istek göndermek ne kadar da talep Düzeyli İstemci Tarafı API kullanarak, önemli değil: Bağlantı Düzey İstemci Tarafı 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 
    } 

veya kullanma:

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 
    } 

Unsmarshaller'ı kullanarak veya getDataBytes'i kullanarak manuel olarak kullanıp kullanmamaya karar vermez, sonuç aynıdır - yukarıdaki istisna.

Yanıtın http durumu 200 OK, üstbilgiler iyi, "Varsayılan" bir varlık (öbek yok), içerik uzunluğu yaklaşık 500-2000 Kb'dir (artan akka.http.parsing.max- varsayılan değer yeterli olmasına rağmen içerik uzunluğu yardımcı olmaz. Sunucu da tamam - diğer platformlardaki diğer http kütüphaneleri bu API ile çalışıyor.

Hata mı, yoksa yanlış bir şey mi yapıyorum? Scala için en iyi engelleme olmayan, asycnhonous http kütüphanesi nedir?

+0

** Scala için en iyi engellenmeyen, asycnhonous http kütüphanesi nedir? ** Oğlum bunu anlarsa lütfen bana bildirin. Akka http kullanmaya yeni başladık ve aynı hatayı gördüğünüz davranışla görüyorum. Maksimum içerik uzunluğu yardımcı olmaz. Sanırım içerik boyutuna göre daraltmıştım çünkü belli bir miktar veri gönderdiğimde, bu gerçekleşmeye başlıyor. Her şey daha küçük istekler ile tasarlandığı gibi çalışır. – haggy

+0

* Güncelleme: * Gönderdiğim verilerle hiçbir ilgisi olmadığını doğrulayabildim. 1 büyük toplu istek göndermek yerine, çok küçük olanlara (aynı API'yi kullanarak) ayırdım ve başarılı bir şekilde geçti. Bu kesinlikle doğal bir veri sınırı veya daha büyük isteklerle akış sorunlarına neden olan bir şey gibi görünmesini sağlıyor. – haggy

+0

* Güncelleme: * Sorunumu çözebiliyordum. Bir yönlendirme yolu sorunuydu (evet, ciddi). Aynı seviyede başka bir yolla bir şekilde çelişen iç içe geçmiş bir rota vardı. Bir kez rotaların yapısını yeniden çalıştım, her şey iyi çalıştı. – haggy

cevap

0

İlk soruyla ilgili yorumum var, ama aynı zamanda burada cevap veriyor, bu da herhangi birinin yardımcı olması durumunda bu durumun düşürülmesini sağlayabilir.

Bir yönlendirme yolu sorunuydu (evet, ciddi olarak). Aynı seviyede başka bir yolla bir şekilde çelişen iç içe geçmiş bir yol vardı (temelde başka bir yolu geçersiz kılmak için bir rotaya neden olan gariplik vardı ...). Bir kez rotaların yapısını yeniden çalıştım, her şey iyi çalıştı.

+0

Garip çatışma nasıl demek istiyorsun? Rotalarım hakkında garip bir şey görmüyorum, yine de aynı hatayı (sık sık tüm istekleri için değil) aldım. – Alex