2017-05-02 18 views
0

ストリーム使用して応答をチャンクを取得することはできません、私はいくつかの遅延イベントを発行修正版を作成しましたので、私は、クライアント側で同じ割合で発生して、それらを観察することができた:が正しくアッカは<a href="https://www.playframework.com/documentation/2.5.x/JavaStream#Chunked-responses" rel="nofollow noreferrer">Play! Framework documentation</a>で提供例を使用して

public Result playExampleDelayed() { 
    Source<ByteString, ?> source = Source.<ByteString> actorRef(5, OverflowStrategy.dropNew()) 
      .mapMaterializedValue(sourceActor -> { 
       for (int i = 0; i < 10; ++i) { 
        Thread.sleep(1000); 
        sourceActor.tell(ByteString.fromString("tick " + i), null); 
       } 
       sourceActor.tell(new Status.Success(NotUsed.getInstance()), null); 
       return null; 
      }); 
    return ok().chunked(source); 
} 

ただし、curlを使用すると、ソースが完了するとすべてのイベントが1つのステップで取得されます。私が意図した動作を得ることができます別のソースの種類を使用して

:この場合

public Result tick() { 
    Source<ByteString, ?> source = Source.<ByteString> tick(Duration.create(0, TimeUnit.SECONDS), 
      Duration.create(1, TimeUnit.SECONDS), ByteString.fromString("tick")); 
    return ok().chunked(source); 
} 

は、私が毎秒コンソール1つのチャンクで取得します。

Akkaのドキュメントによると、最初の例がうまくいくと思います。私は間違って何をしていますか?

答えて

2

あなたはmapMaterializedValueコールでThread.sleepを使用しています。これは、ストリームrun()の直後に発生する同期呼び出しです。ここでブロックすると(例:Thread.sleep)、すべての実体化がブロックされます。したがって、すべてのメッセージはループ実行の最後にアクタによって取得されます。

ボトムライン:Akkaを使用する場合は、常にThread.sleepを使用しないようにしてください。

逆に、Source.tickはスケジューラ(非同期、非ブロッキング)を使用しているため、はるかに性能が高く、堅牢で洗練されたソリューションです。

+0

'Thread.sleep'はちょうど"重い作業 "のシミュレーションでした。 CompletableFutureで 'for'サイクルを囲んで、このトリックを作った。どうもありがとう! –

+0

それは通常それが使用されている正しいです。私は言い換えて言います:) ボトムライン:Akkaを使用すると、常にブロックから遠ざかります。 –

関連する問題

 関連する問題