2016-09-20 3 views
0

PlayアプリケーションにWebSocketサーバーがあり、これをakka-httpサービスに移動したいとします。私は現在、Acckaには存在しないPlayの一部であるActorFlow.actorRefを使用しています。PlayからAkkaへのWebSocketの移動HTTP

WebSocketが承認されると、私はRabbitMQキューに登録し、各メッセージをWebSocketに転送します。 WebSocketからメッセージを受け取ると、ローカルで処理し、他の人をRabbitMQ交換に転送します。

akka-httpを使用して同じことを行うにはどうすればよいですか? Sink.actorRefを使用してシンクを作成し、そこにある受信メッセージを処理できますが、送信元はどうですか?

Source.actorRefでソースを作成できますが、マテリアライズされたときにメッセージを送信するアクターにどのようにアクセスできますか?私のRabbitMQサブスクリプションのforeachからメッセージを送信するために使用すべき種類のソースがありますか?

これを取得したら、Flow.fromSinkAndSourceを使用して必要なフローを返すことができるように見えます。

+0

はあなたがこれまで行ってきたので、我々はより多くのコンテキストを取得することができますかを示すことができ、あなたの問題解決を望みますか? この場合、actorRefであるマテリアライズされた値を取得する方法は、[mapMaterialized](http://doc.akka.io/api/akka/current/index.html#akka.stream。あなたが探しているものかもしれない – Qingwei

+0

@ Qingwei私はいくつかの異なる繰り返しを行ってきましたが、これは私が現時点で持っているものです(Playの 'ActorFlow.actorRef'から取得したコードを使用します)。それは、それが開かれるとすぐに接続を閉じます。 https://gist.github.com/danellis/643e858d830dbea58bd84e265fb64110 – Derecho

答えて

0

私はあなたの要件に言い換えます

あなたはローカル

  1. プロセスにいくつかの要求を必要とし、RabbitMQのために、クライアント
  2. フォワード
  3. いくつかの要求に応答を送るのWebSocketエンドポイントを持っている
  4. rabbitMQを購読し、rabbitMQからwebsocketクライアントにメッセージを転送します。

私の提案に必要な場合を除き、その回避の俳優で、俳優は強力ですが、私はそれがモデルにフィットする場合は、以下の

がどのようにパイプの源であり、俳優

せずに一緒にシンク読みやすくし、約理由ストリームを見つけます
def wshandler: Flow[Message, Message, _] = { 
    val rabbit = new Rabbit() 
    val src = 
     Source 
     .actorRef(100, OverflowStrategy.dropBuffer) 
     .mapMaterializedValue(ref => { 
      rabbit 
      .subscribe[String]("updates", queueName, topics) { 
       (body, topic) => 
       log.debug("Received from rabbit") 

       // here you forward everything from rabbitmq to  
       // client using materialized actorRef 
       ref ! TextMessage(body) 
      } 
     }) 

    // you need to implement your own pattern matching logic to differentiate between request to process 
    // locally and request to route to rabbitMQ 
    val sink = Sink.foreach[Message](m => m match { 
     case localReq => // your request response processing logic 

     case rabbitMq => // publish to rabbitMQ 
    }) 

    Flow.fromSinkAndSource(sink, src) 
    } 

このスニペットは、あなたが示した主旨のものを実装していないことが

+0

問題は、私の要点のように、購読が完了するまで懇願を隠す俳優がいないことです。 – Derecho

+0

申し訳ありませんが、私はあなたの要点に何が問題なのかを確認しておく必要がありますか?それはコンパイルされませんか?それが開かれたらそれの接続を閉じますか? – Qingwei

+0

ええ、私が言ったように、それは開いてすぐに接続を閉じます。なぜ私は全く知りませんでした。 – Derecho

関連する問題