2016-03-25 21 views
5

akka httpライブラリを使用して、残りのAPIのクライアントを作成しています。ライブラリは非常に強力なようですが、私にとっては非常に不安定です。akka http throws EntityStreamException:エンティティストリームの切り捨て

EntityStreamException:エンティティストリームの切り捨て

と、この後に、それはすべての後続の要求の処理を停止かなり頻繁に(常にではない)私はHttpResponse.entityを消費しようとすると、それは次の例外がスローされます。たぶん、背圧や俳優が死んでしまうようなことに対処しようとしているかもしれませんが、わかりません。

要求レベルのクライアント側の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 
    } 

または接続レベルクライアント側の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 
    } 

アンマーシャラーを使用してエンティティを消費するのか、getDataBytesを使用して手動でエンティティを消費するのかは分かりません。結果は同じです。つまり、上記の例外です。

応答のhttpステータスは200です。ヘッダーは正常です。ヘッダーは「デフォルト」エンティティ(チャンクなし)です。コンテンツの長さは約500-2000 Kbです(akka.http.parsing.max- content-lengthは助けにはなりませんが、デフォルト値で十分です)。サーバーもOKです。他のプラットフォームの他のhttpライブラリーも、このAPIでうまく動作します。

これはバグですか、何か間違っていますか?スカラのための最高の非ブロッキング非同期httpライブラリは何ですか?

+0

**スカラーのための非ブロッキングで無秩序なhttpライブラリは何ですか?**ああ、あなたがそれを理解してくれれば教えてください。私はちょうどakka httpを使い始めました。あなたが見ている正確な振る舞いと同じエラーが表示されています。コンテンツの最大長は役に立たない。ある程度の量のデータを送信すると、これが起き始めるので、コンテンツサイズに絞ったと思います。より小さな要求ですべてが意図どおりに機能します。 – haggy

+0

*更新:*送信したデータとは関係がないことを確認できました。大量のバッチリクエストを1つ送信する代わりに、(同じAPIを使用して)多数の小さなリクエストに分割し、正常に処理されました。これは間違いなく、固有のチャンク化されたデータの制限や、より大きなリクエストでストリームの問題を引き起こすようなものに見えるようにしています。 – haggy

+0

*もう一度アップデートしてください:*問題を解決できました。ルーティングパスの問題でした(はい、真剣に)。私は同じレベルで別のルートと何らかの形で衝突していたネストされたルートを持っていました。私がルートの構造を再加工すると、すべて正常に機能しました。 – haggy

答えて

0

私は最初の質問にコメントしていますが、ここでも回答していますので、誰かを助ける場合にはそれを上書きすることができます。

ルーティングパスの問題でした(はい、真剣に)。私は同じレベルで別のルートと何らかの形で矛盾しているネストされたルートを持っていました(基本的に、あるルートが別のルートを上回る不思議さがありました...)。私がルートの構造を再加工すると、すべて正常に機能しました。

+0

どうやって奇妙な紛争を意味するのですか?私は私のルートについて何か変わったものは見ませんが、私は同じエラーをかなり頻繁に受けます(すべてのリクエストではありません)。 – Alex

関連する問題