【发布时间】:2016-09-21 16:31:01
【问题描述】:
目标是用这个签名实现一个函数
def bindedSinkAndSource[A]:(Sink[A, Any], Source[A, Any]) = ???
无论接收器接收到什么,返回的源都会发出。
我的主要目标是通过 handleWebSocketMessages 指令实现一个 websocket 转发器。
转发器图是:
leftReceiver ~> rightEmitter
leftEmitter <~ rightReceiver
其中leftReceiver 和leftEmiter 是左端点处理程序流的进出;而rightReceiver 和rightEmitter 是右端点处理程序流的进出。
例如:
import akka.NotUsed
import akka.http.scaladsl.model.ws.Message
import akka.http.scaladsl.server.Directive.addByNameNullaryApply
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.Route
import akka.stream.scaladsl.Flow
import akka.stream.scaladsl.Sink
import akka.stream.scaladsl.Source
def buildHandlers(): Route = {
val (leftReceiver, rightEmitter) = bindedSinkAndSource[Message];
val (rightReceiver, leftEmitter) = bindedSinkAndSource[Message];
val leftHandlerFlow = Flow.fromSinkAndSource(leftReceiver, leftEmitter)
val rightHandlerFlow = Flow.fromSinkAndSource(rightReceiver, rightEmitter)
pathPrefix("leftEndpointChannel") {
handleWebSocketMessages(leftHandlerFlow)
} ~
pathPrefix("rightEndpointChannel") {
handleWebSocketMessages(rightHandlerFlow)
}
}
handleWebSocketMessages(..) 指令不允许访问接收到的流的具体化值这一事实让我的所有想法都感到沮丧。
【问题讨论】:
-
你可以使用GraphStage,doc.akka.io/docs/akka/2.4.10/scala/stream/stream-customize.html
-
@gaston,我试过了,但我不知道怎么做。据我所知,最终的形状取决于端口的类型和数量。而且我发现无法绑定两个中间没有端口的图形阶段。你能给我一个提示吗?
标签: scala websocket akka-stream akka-http