2016-06-30 2 views
0

저는 Akka와 Scala를 배우고 간단한 채팅 서버를 구축하려고합니다. 나는 새로운 생성 된 액터를 관리하기위한 간단한 세션 관리자를 만들기 위해 아래 코드를 작성했습니다. 새 액터를 만들고 ActorRef를 HashMap에 넣을 수 있지만 특정 액터로 메시지를 보내려고하면 액터에서 메시지를받을 수 없습니다.akka와 scala가있는 간단한 채팅 서버 구현

다음은 코드입니다.

답변

2

문제는 세션 액터가 ChatMsg 유형의 메시지를 가져올 것으로 예상하지만 사용자가이를 String으로 보내고 있다는 것입니다.

주된 방법은 ChatMsg 개체를 SessionManager 액터로 보내는 것입니다. SesionManager가이를 수신하고 패턴 일치를 통해 해당 필드를 추출합니다. from 및 message 모두 String을 입력하십시오. 그런 다음 관련 Session 액터를 찾고 ChatMsg 객체에서 추출한 메시지를 보냅니다. 따라서 ChatMsg 개체 자체가 아닌 ChatMsg 개체의 메시지 부분을 보내는 것입니다.

가장 쉬운 방법은 SessionManager의 receive 메소드에서 일치하는 패턴을 만들고받은 실제 ChatMsg 객체의 이름을 바인드 한 다음이를 Session 액터로 보내는 것입니다. 패턴 일치에 "이름"@ 패턴을 접두사로 추가하면됩니다.

class SessionManager extends Actor{ 
    val system = ActorSystem("ChatSession") 
    val sessions = new HashMap[String,ActorRef] 
    val inbox = Inbox.create(system) 

    def receive ={ 
     case Login(username) => 
      println(s"$username Login, now create Actor") 
      val session = system.actorOf(Props(new Session(username))) 
      sessions += (username->session) 
      println(s"session added $sessions") 
     case chatMsg @ ChatMsg(from,message) => 
      sessions(from) ! chatMsg 

    } 
} 
+0

많은 도움이되었습니다. 감사! –