【发布时间】:2019-05-10 13:13:52
【问题描述】:
我有一个 websocket 端点,它每秒向客户端发送一条文本消息。客户端从不向服务器发送任何消息。
使用下面的 JS 代码,它按预期工作,它保持每秒注销消息:
var ws = new WebSocket("ws://url_of_my_endpoint");
ws.onmessage = (message) => console.log(message.data);
我想使用 Akka HTTP 在 Scala 中创建一个类似的消费者。 我根据official docs 创建了以下代码。
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
import system.dispatcher
val url = "ws://url_of_my_endpoint"
val outgoing: Source[Message, NotUsed] = Source.empty
val webSocketFlow =
Http().webSocketClientFlow(WebSocketRequest(url))
val printSink: Sink[Message, Future[Done]] =
Sink.foreach[Message] {
case message: TextMessage.Strict =>
println("message received: " + message.text)
case _ => println("some other message")
}
val (upgradeResponse, closed) =
outgoing
.viaMat(webSocketFlow)(Keep.right)
.toMat(printSink)(Keep.both)
.run()
val connected = upgradeResponse.map { upgrade =>
if (upgrade.response.status == StatusCodes.SwitchingProtocols) {
Done
} else {
throw new RuntimeException(s"Connection failed: ${upgrade.response.status}")
}
}
connected.onComplete(_ => println("Connection established."))
closed.foreach(_ => println("Connection closed."))
问题是连接在几秒钟后关闭。有时 1 秒后,有时 3-4 秒后。 JS客户端工作正常,所以我认为问题不在服务器上。
代码有什么问题?应该怎么改,这样才能告诉我哪里出错了?
【问题讨论】: