我是akka-stream的新手,我正在尝试使用Framing.lengthField和websocket https://github.com/akka/akka/blob/master/akka-stream/src/main/scala/akka/stream/scaladsl/Framing.scala
这就是我所拥有的:
path("websocket") {
handleWebSocketMessages(websocketFlow)
}
def websocketFlow(): Flow[Message, Message, Any] =
Flow.fromGraph(
GraphDSL.create(Source.actorRef[TestMessage](bufferSize = 10, OverflowStrategy.fail)) {
implicit builder =>
source =>
val binaryMessageDecoder = Framing.lengthField(4, 0, 1024 * 32, ByteOrder.BIG_ENDIAN)
val byteStringToMessage = Flow[ByteString].map { bytes =>
TestMessage.parseFrom(bytes.toArray[Byte])
}
val fromWebsocket = builder.add(
Flow[Message].map {
case bm: BinaryMessage =>
bm.dataStream
.via(binaryMessageDecoder)
.via(byteStringToMessage)
}
)
val backToWebsocket = builder.add(
Flow[TestMessage].map {
case TestMessage(text) =>
TextMessage(text)
}
)
val actorSink = Sink.actorRef[TestMessage](testActor, PoisonPill)
import GraphDSL.Implicits._
fromWebsocket ~> actorSink // This line does not compile
source ~> backToWebsocket
FlowShape(fromWebsocket.in, backToWebsocket.out)
}
)
我不明白这个问题。我怎样才能做到这一点?
答案 0 :(得分:1)
您的fromWebsocket
流会返回流而不是消息,而您的actorSink
会收到消息。
如果您想要编译它,您必须确保它返回消息,例如您可以将map
更改为flatMapConcat
。这将确保从流中返回的消息在新的消息流中连接。