2017-10-24 2 views
0

Nach der Play framework documentation haben wir die Möglichkeit, die postStop Methode zu überschreiben, aber es hat keine ActorRef. Ich brauche ein ActorRef, weil ich ActorRef als ein Bezeichner in einem HashMap benutze, der die Zuordnungen der Akteure zu verbundenen Klienten enthält: auf trennen, möchte ich dieses Mapping von der HashMap entfernen.Abrufen eines ActorRef, wenn ein WebSocket in Play geschlossen wird

Edit: - Hier HashMap Werke als Authentifizierungs pool.The erste Nachricht vom Client für die Authentifizierung ist, und auf die Validierung der Instanz von ActorRef hinzugefügt HashMap. Auf den folgenden Veranstaltungen/messages Genehmigung durch die Überprüfung der Existenz von ActorRef in HashMap, haben einen Blick auf den folgenden Code verifiziert: -

def authenticate(actorRef: ActorRef, message: SocketParsedMessage) { 
    (message.data \ "token").validate[String] match { 
     case s: JsSuccess[String] => { 
     val token = jwt.parse(s.get) 
     if (jwt.verify(token,jwtSecret)) { 
      val userId = UUID.fromString(jwt.getSubject(token)) 
      hashMapU2A += (UUID.fromString(jwt.getSubject(token)) -> actorRef) 
      hashMapA2U += (actorRef -> userId) 
      actorRef ! SocketParsedMessage(AllowedSocketMessageTypes.AUTHENTICATE, Json.obj(
      "success" -> true, "message" -> "Authorized for making further requests request")).toString 
      publishUserStatus(userId) 
     } else { 
      actorRef ! SocketParsedMessage(AllowedSocketMessageTypes.AUTHENTICATE, JsObject(
      Seq("success" -> JsBoolean(false), "message" -> JsString("Invalid token")) 
     )).toString 
     } 
     } 
     case e: JsError => { 
     actorRef ! SocketParsedMessage(AllowedSocketMessageTypes.AUTHENTICATE, Json.obj(
      "success" -> false, "message" -> "Token not supplied with request")).toString 
     actorRef ! PoisonPill 
     } 
    } 
    } 



val hashMapA2U: mutable.HashMap[ActorRef, UUID] = mutable.HashMap() 
+0

Der Subscriber-Actor stirbt bei einer onClose-Aktion. Du wirst nicht mehr darauf zugreifen können. Was versuchst du zu tun? –

+0

@Robertudah Ich habe einen Websocket basierten Benutzer online/offline Tracker implementiert. Und ich benutze actorRef in HashMap zum Abrufen der Benutzer-ID des Clients verbunden. –

+0

Sie können Ihre '' 'HashMap [ActorRef, UUID]' '' nicht zu '' 'HashMap [String, ActorRef']' ''? – alifirat

Antwort

0

Meine Dummheit.

Eigentlich ActorRef ist bereits in meiner benutzerdefinierten Implementierung von Actor zur Verfügung gestellt, und ich kann es verwenden.

class MyWebSocketActor(sh: HandleSocket, out: ActorRef) extends Actor { 
    def receive = { 
     case msg: String => { 
     Json.fromJson[SocketParsedMessage](Json.parse(msg)) match { 
      case s: JsSuccess[SocketParsedMessage] => { 
      sh.HandleSocketMessages(out, s.get) 
      } 
      case _: JsError => { 
      out ! PoisonPill 
      } 
     } 
     // println(parsedMsg) 
     // out ! (msg) 
     } 
    } 

    override def postStop(): Unit = { 
    // super.postStop() 
    sh.clientDisconnected(out) 
    } 
} 
Verwandte Themen