この質問で説明されているテクニックに基づいて、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 を提供する場合、これは受け入れられる回答です)。