Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 处理websocket命令的Akka http方法_Scala_Websocket_Akka_Workflow_Akka Stream - Fatal编程技术网

Scala 处理websocket命令的Akka http方法

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

假设我有一个控制器,它处理从websocket接收到的命令

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结合使用-