如何使用框架与akka websocket

时间:2016-03-25 12:03:17

标签: akka-stream akka-http

我是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)
  }
)

我不明白这个问题。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您的fromWebsocket流会返回流而不是消息,而您的actorSink会收到消息。

如果您想要编译它,您必须确保它返回消息,例如您可以将map更改为flatMapConcat。这将确保从流中返回的消息在新的消息流中连接。