2016-06-30 3 views
0

Я изучаю Akka и Scala и пытаюсь создать с ним простой чат-сервер. Я написал приведенный ниже код, чтобы создать простой диспетчер сеансов для управления новыми созданными Актерами. Я могу создать новых актеров и поставить ActorRef на HashMap, однако, когда я пытаюсь отправить сообщение конкретному Актеру, сообщение просто не может быть получено Актером.Реализовать простой чат-сервер с akka и scala

Вот код.

import akka.actor.{ ActorRef, ActorSystem, Props, Actor, Inbox } 
import scala.concurrent.duration._ 
import scala.collection.mutable.HashMap 


case class ChatMsg(from:String,message:String) 
case class Login(username:String) 

class Session(userID:String) extends Actor{ 
    val loginTime = System.currentTimeMillis 
    println(s"Session created time :$loginTime") 
    def receive ={ 
    case ChatMsg(from,message) => println(s"message :$message from $from !") 
    } 
} 

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(from,message) => 
     sessions(from) ! message 

} 
} 



object MyAkkaTest extends App { 

val system = ActorSystem("MyAkkaTest") 
val user = system.actorOf(Props[SessionManager],"MyActor") 
val inbox = Inbox.create(system) 
user ! Login("Mary") 
user ! Login("John") 
user ! ChatMsg("Mary","this is a testing message") //this message can never sent... 


} 

ответ

2

Проблема заключается в том, что ваш участник сеанса, ожидающий получения сообщений типа ChatMsg, но вы отправляете ему строку.

Ваш основной метод отправляет объект ChatMsg ролику SessionManager. SesionManager получает это, и через сопоставление шаблонов извлекает его в поля; from и message, оба типа String. Затем он находит соответствующего участника сеанса и отправляет ему сообщение, извлеченное из объекта ChatMsg. Поэтому он просто отправляет часть сообщения объекта ChatMsg, а не сам объект ChatMsg.

Самый простой способ исправить это - это сделать соответствие шаблону в методе приема SessionManager, связать имя для действительного объекта ChatMsg, а затем отправить его субъекту сеанса. Вы можете сделать это, предварительно сопоставив шаблон с шаблоном «имя» @:

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

Это помогло! Благодаря! –

Смежные вопросы