Pisanie do Enumeratora i obsługiwanie aktorami

0

W Samplu WebSocketChat było użyte

val (out, channel) = Concurrent.broadcast[String]

Aby mieć takiego enumeratora, do którego da się pisać - tutaj za pomocą channel.
Zastanawiam się jak stworzyć Enumerator do którego będę mógł pisać za pomocą jakiegoś obiektu, tak jak powyżej. Nazwa Broadcast jest dla mnie myląca, nie wiem czy jest to sensowna opcja gdy jednemu Enumeratorowi będzie odpowiadał jeden klient.

Dodatkowe pytanie, jak mamy taki kod (z http://www.playframework.com/documentation/2.3.x/ScalaWebSockets)

import play.api.mvc._
import play.api.Play.current

def socket = WebSocket.acceptWithActor[String, String] { request => out =>
  MyWebSocketActor.props(out)
}

object MyWebSocketActor {
  def props(out: ActorRef) = Props(new MyWebSocketActor(out))
}

class MyWebSocketActor(out: ActorRef) extends Actor {
  def receive = {
    case msg: String =>
      out ! ("I received your message: " + msg)
  }
}

To jak się komunikować z takim aktorem (z innego podobnego aktora)? Bo zamiast ActorRef'a, dajemy Props czyli ten nasz ActorRef gdzieś tam jest tworzony. out to o ile dobrze rozumiem inny aktor, który bezpośrednio obsługuje socket.

1

ad 1)

  def ws = WebSocket.using[String] { implicit request =>
    val iteratee = Promise[Iteratee[String, Unit]]()
    val enumerator = Concurrent.unicast[String](onStart = { client =>
      iteratee.success(Iteratee.foreach[String](msg => client.push(s"Received: $msg")))
    })

    (Iteratee.flatten(iteratee.future), enumerator)
  }

ad 2)

  case class SendMsg(out: ActorRef, msg: String)
  def ws3 = WebSocket.acceptWithActor[String, String] { implicit request =>
    out => Props(new ActorOne(out))
  }

  class ActorOne(out: ActorRef) extends Actor {
    def receive = {
      case msg: String =>
        val actorTwo = Akka.system.actorOf(Props[ActorTwo])
        actorTwo ! SendMsg(out, msg)
    }
  }

  class ActorTwo extends Actor {
    def receive = {
      case SendMsg(o, msg) => o ! msg
    }
  }

Ah, chodzi Ci o odwrotna sprawe. W takim razie robienie tego jest bezsensu. Ten aktor od ws ma sie zajmowac tylko obsluga ws, ewentualnie wolac/pytac innych aktorow.

1 użytkowników online, w tym zalogowanych: 0, gości: 1