Question

Following the book Akka Concurrency by Derek Wyatt (section 13.1 The plane's Telnet server), he uses something called Handle from akka.actor.IO. However, I can't find it in the current Akka API docs. I can't find it in any of the migration guides either from previous akka versions... Did it get moved somewhere? Or deprecated?

Here is the code in question that I need to "convert" to current akka version (2.3):

import akka.actor.{Actor, ActorRef, IO,
                     IOManager, ActorLogging, Props}
  import akka.util.ByteString
  import scala.collection.mutable.Map
  import akka.pattern.ask
  import akka.util.Timeout
  import scala.concurrent.duration._
  import scala.concurrent.ExecutionContext.Implicits.global
  import scala.util.{Success, Failure}

  class TelnetServer(plane: ActorRef) extends Actor
                                         with ActorLogging {
    import TelnetServer._

    // The 'subservers' stores the map of Actors-to-clients that we
    // need in order to route future communications
    val subservers = Map.empty[IO.Handle, ActorRef]

    // Opens the server's socket and starts listening for incoming
    // stuff
    val serverSocket =
      IOManager(context.system).listen("0.0.0.0", 31733)

    def receive = {
      // This message is sent by IO when our server officially
      // starts
      case IO.Listening(server, address) =>
        log.info("Telnet Server listeninig on port {}", address)

      // When a client connects (e.g. telnet) we get this
      // message
      case IO.NewClient(server) =>
        log.info("New incoming client connection on server")
        // You must accept the socket, which can pass to the sub
        // server as well as used as a 'key' into our map to know
        // where future communications come from
        val socket = server.accept()
        socket.write(ByteString(welcome))
        subservers +=
          (socket ->
           context.actorOf(Props(new SubServer(socket, plane))))

      // Every time we get a message it comes in as a ByteString on
      // this message
      case IO.Read(socket, bytes) =>
        // Convert from ByteString to ascii (helper from companion)
        val cmd = ascii(bytes)
        // Send the message to the subserver, looked up by socket
        subservers(socket) ! NewMessage(cmd)

      // Client closed connection, kill the sub server
      case IO.Closed(socket, cause) =>
        context.stop(subservers(socket))
        subservers -= socket
    }
  }
Was it helpful?

Solution

This book use akka 2.1.x, and the io module is still experimental then, so many apis have changed or removed since then. See the migration guide

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top