2017-03-21 18 views
2

Play documentation on WebSocketsによると、WebSocketを確立する標準的な方法は、ActorFlow.actorRefを使用することです。これは、私の俳優のPropsを返す関数を使用します。私の目標は、たとえば、最初のメッセージを送信したり、ActorRefを別のアクタのコンストラクタに渡すために、この基底の参照先を取得することです(ActorRef)。ドキュメントから最小限の例の観点でActorFlowからアクタ参照(ActorRef)を取得する方法は?

は、私はこれを達成しようとしています:

class WebSocketController @Inject() (implicit system: ActorSystem, materializer: Materializer) { 

    def socket = WebSocket.accept[String, String] { request => 
    val flow = ActorFlow.actorRef { out => MyWebSocketActor.props(out) } 
    // How to get the ActorRef that is created by MyWebSocketActor.props(out)? 
    // Fictitious syntax (does not work) 
    flow.underlyingActor ! "first message send" 
    flow 
    } 
} 

どのようにして作成された俳優への参照を取得できますか?

この時点でActorRefを取得できない場合(フローのマテリアライゼーションが必要なのでしょうか)、作成されたアクタへの参照を保存する最も簡単な方法は何でしょうか?

答えて

1

あなたはいくつかのトリックがactorRefアクセスするために行うことができますActor.preStart()フックを使用して:私は期待していた

class MyWebSocketActor(
    out: ActorRef, 
    firstMessage: Any, 
    actorRegistry: ActorRef 
) extends Actor { 
    import play.api.libs.json.JsValue 
    override def preStart(): Unit = { 
    self ! firstMessage 
    actorRegistry ! self 
    } 
    ... 
} 

def socket = WebSocket.accept[String, String] { request => 
    ActorFlow.actorRef { out => 
    Props(new MyWebSocketActor(out, "First Message", someRegistryActorRef)) 
    } 
} 
+0

私は 'actorRegistry'アプローチを回避することができます。私は実際のユースケースでこの方向に進んでいるソリューションを実装しましたが、結果のコードはかなり複雑で、非常に単純なロジックを多くの不要な部分に散らばらなければならないように感じます。 – bluenote10

+0

@ bluenote10私は、アクターの名前が一意ではないので、そのライフサイクルがフローによって管理され、死んだアクタへの参照で終わる可能性があるため、基になるactorRefを取得するとカプセル化が中断されると主張します。再送信後に配信されるメールボックスをカウントします。 – Tair

+0

@ bluenote10私は実際に_right_を知っていませんが、ActorFlow.actorOfを再実装することを止めるものはありません。ソースコードは開いています:) – Tair

関連する問題