Scala 处理websocket命令的Akka http方法
假设我有一个控制器,它处理从websocket接收到的命令Scala 处理websocket命令的Akka http方法,scala,websocket,akka,workflow,akka-stream,Scala,Websocket,Akka,Workflow,Akka Stream,假设我有一个控制器,它处理从websocket接收到的命令 class WebSocketController(implicit M: Materializer) extends Controller with CirceSupport { override def route: Route = path("ws") { handleWebSocketMessages(wsFlow) } def wsFlow: Flow[Message, Message, A
class WebSocketController(implicit M: Materializer)
extends Controller
with CirceSupport {
override def route: Route = path("ws") {
handleWebSocketMessages(wsFlow)
}
def wsFlow: Flow[Message, Message, Any] =
Flow[Message].mapConcat {
case tm: TextMessage =>
decode[Command](tm.getStrictText) match {
// todo pass this command to some actor or service
// and get response and reply back.
case Right(AuthorizeUser(login, password)) =>
TextMessage(s"Authorized: $login, $password") :: Nil
case _ =>
Nil
}
case bm: BinaryMessage =>
bm.dataStream.runWith(Sink.ignore)
Nil
}
}
所以,我得到一个命令,反序列化它,我想做的下一步是将它传递给某个服务或参与者,该服务或参与者将在将来返回给我[SomeReply]
问题是:
使用akka streams处理此类流的基本方法是什么?在处理流中的未来时,通常需要mapAsync。要添加到特定示例中,请执行以下操作:
def asyncOp(msg: TextMessage): Future[SomeReply] = ???
def tailorResponse(r: SomeReply): TextMessage = ???
def wsFlow: Flow[Message, Message, Any] =
Flow[Message]
.mapConcat {...}
.mapAsync(parallelism = 4)(asyncOp)
.via(tailorResponse)
如果未来结果的顺序不相关,也可以使用mapAsyncUnordered。
并行性表示在阶段背压之前,可以同时运行多少个期货
另见
阶段
如何与ask结合使用-