私はスカラの周りで遊び始めて、スカラーのウェブソケットチャットルームのこの特定の定型会に来ました。Scala&Play Websockets:交換されたメッセージを保存する
メッセージは、接続されたすべてのクライアントに送信するために、ソースとシンクとしてMessageHub.source()
とBroadcastHub.sink()
を使用します。
この例は、そのままメッセージをやりとりするために問題なく動作しています。
private val (chatSink, chatSource) = {
// Don't log MergeHub$ProducerFailed as error if the client disconnects.
// recoverWithRetries -1 is essentially "recoverWith"
val source = MergeHub.source[WSMessage]
.log("source")
.recoverWithRetries(-1, { case _: Exception ⇒ Source.empty })
val sink = BroadcastHub.sink[WSMessage]
source.toMat(sink)(Keep.both).run()
}
private val userFlow: Flow[WSMessage, WSMessage, _] = {
Flow.fromSinkAndSource(chatSink, chatSource)
}
def chat(): WebSocket = {
WebSocket.acceptOrResult[WSMessage, WSMessage] {
case rh if sameOriginCheck(rh) =>
Future.successful(userFlow).map { flow =>
Right(flow)
}.recover {
case e: Exception =>
val msg = "Cannot create websocket"
logger.error(msg, e)
val result = InternalServerError(msg)
Left(result)
}
case rejected =>
logger.error(s"Request ${rejected} failed same origin check")
Future.successful {
Left(Forbidden("forbidden"))
}
}
}
私はチャットルームで交換されたメッセージをDBに保存します。
マップとフォールド機能をソースとシンクに追加して、送信されたメッセージを取得しようとしましたが、できませんでした。
Iは
val flow = Flow[WSMessage].map(element => println(s"Message: $element"))
source.via(flow).toMat(sink)(Keep.both).run()
以下のようMergeHubとBroadcastHub間を流れる段を追加しようとしたが、それはそのような署名でtoMatを参照することができないコンパイルエラーをスロー。
送信されたメッセージを取得してDBに保存するには、どうすればよいか教えてください。完全なテンプレートの
リンク:
https://github.com/playframework/play-scala-chatroom-example
追加してください。フローステージをどのように追加しようとしたかを示すコード(プロトタイプ)。また、DBにデータを保存する際のフローステージの定義も表示します。 @FredericA。 –
フローステージを追加しようとしたコードを追加しました。私はこれが初めてだから間違っているかもしれない。 – practice2perfect
実際にこのコードをフローに使用しましたか?それは明らかに間違っており、コンパイルエラーを説明します –