Основываясь на методе, описанном в этом вопросе, я написал базовый микросервис для обеспечения непрерывной потоковой передачи ByteString с использованием 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-запрос, а сущность одного ответа представляет собой фрагментированный поток ByteStrings, а именно «тест» каждую 1 секунду.
Я проверил, что поток создает «тестовые» значения с помощью клиента scala. Однако очень удобным методом отладки было бы указать веб-браузеру на микросервис для просмотра потока фрагментов по мере поступления данных. Я попытался указать браузеру Chrome порт, но браузер просто завис в состоянии загрузки/занятости.
Итак, мой вопрос: как изменить HttpResponse, чтобы браузер мог отображать поток в режиме реального времени?
Решение, которое требует другого объекта HttpResponse для просмотра в браузере, отличного от использования программным клиентом (например, если адрес «/stream» предоставляет HttpResponse для клиентов, а «/browserView» предоставляет другой HttpResponse, то это приемлемый ответ).
curl -v http://127.0.0.1:8200/stream
, все будет работать как положено. Поэтому я подозреваю, что кеширование является виновником. - person Rüdiger Klaehn   schedule 26.10.2015