Akka-Http:使用websockets - 扩展Flow的模式

时间:2018-02-02 21:22:15

标签: scala websocket akka-stream akka-http

akka http websocket效果很好。它需要Flow[Message, Message, Future[Done]

我们可以创建相同形状的来源val src = Source.maybe和接收器val snk = Sink.foreach(...)并致电Flow.fromSinkAndSourceMat(snk, src)。 src用于向websocket(流的源)发送数据,snk用于接收数据。

有些情况我们希望扩展我们传递的流,即 - 我们希望接收Message,将其发送到另一个流进行JSON解析或数据验证,然后最终发送到接收器。

如何构建我在Http().singleWebSocketRequest(WebSocketRequest("ws://someip:port"), flow)中传递的Flow以包含各种其他流程阶段,然后是最终接收器。 我可以将我的源设置为Source.maybe,因为我只关心传入。

1 个答案:

答案 0 :(得分:1)

您可以将Sink列为一系列Flow和最终Sink

val flow1: Flow[Message, Message, NotUsed] = ???
val flow2: Flow[Message, String, NotUsed] = ???
val sink: Sink[String, Future[Done]] = Sink.foreach[String](println) 

val megaSink = flow1.via(flow2).to(sink)

然后可以使用您的编组Sink将您的WS流组合在一起,类似于您已有的:

Flow.fromSinkAndSource(megaSink, Source.maybe)