0

この質問で説明されているテクニックに基づいて、akka-http. 関連するscalaコードは次のとおりです。

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Flow}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpEntity
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import scala.concurrent.Future
import scala.concurrent.duration._

object Server extends App {

  implicit val system = ActorSystem("testServer")
  implicit val materializer = ActorMaterializer()

  val strToChunk = 
    Flow[String].map(ByteString(_))
                .via(Flow[ByteString].map(HttpEntity.ChunkStreamPart(_)))      

  def sourceFactory = 
    Source(0 seconds, 1 seconds,"test").via(strToChunk)

  val requestHandler: HttpRequest => HttpResponse = {
    case HttpRequest(GET, Uri.Path("/stream"), _, _, _) =>
      HttpResponse(entity = HttpEntity.Chunked(ContentTypes.`text/plain`,
                                               sourceFactory))                 
  }

  val bindingFuture = 
    Http().bind(interface = "localhost", port = 8200).runForeach { conn =>
      conn handleWithSyncHandler requestHandler
  }
}

クライアントは単一の http 要求を作成し、単一の応答のエンティティは ByteString のチャンク ストリーム、つまり 1 秒ごとの「テスト」です。

scala クライアントを使用して、ストリームが「テスト」値を生成することを確認しました。ただし、非常に便利なデバッグ方法は、Web ブラウザーをマイクロサービスに向けて、データが入ってくるときにチャンク ストリームを表示することです。Chrome ブラウザーをポートに向けようとしましたが、ブラウザーは読み込み/ビジー状態でハングしました。

私の質問は、ブラウザがストリームをリアルタイムで表示できるように HttpResponse を変更するにはどうすればよいですか?

ソフトウェア クライアントの消費用とは異なるブラウザー表示用の HttpResponse エンティティを必要とするソリューションは問題ありません (たとえば、"/stream" アドレスがクライアントに HttpResponse を提供し、"/browserView" が別の HttpResponse を提供する場合、これは受け入れられる回答です)。

4

1 に答える 1