All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scala.actors.remote.RemoteActor.scala Maven / Gradle / Ivy

/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2005-2006, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |                                         **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */

// $Id: RemoteActor.scala 9301 2006-11-20 06:05:46Z phaller $


package scala.actors.remote


/**
 This object provides methods for creating, registering, and
 selecting remotely accessible actors.

 A remote actor is typically created like this:
 
 actor {
   alive(9010)
   register('myName, self)

   // behavior
 }
 
It can be accessed by an actor running on a (possibly) different node by selecting it in the following way:
 actor {
   // ...
   val c = select(TcpNode("127.0.0.1", 9010), 'myName)
   c ! msg
   // ...
 }
 
@author Philipp Haller */ object RemoteActor { private val kernels = new scala.collection.mutable.HashMap[Actor, NetKernel] /** * Makes self remotely accessible on TCP port * port. */ def alive(port: int): Unit = { val serv = new TcpService(port) serv.start() kernels += Actor.self -> serv.kernel } /** * Registers a under name on this * node. */ def register(name: Symbol, a: Actor): Unit = { val kernel = kernels.get(Actor.self) match { case None => { val serv = new TcpService(TcpService.generatePort) serv.start() kernels += Actor.self -> serv.kernel serv.kernel } case Some(k) => k } kernel.register(name, a) } /** * Returns (a proxy for) the actor registered under * name on node. */ def select(node: Node, sym: Symbol): Actor = new Actor { def act(): Unit = {} override def !(msg: Any): Unit = msg match { case a: AnyRef => { // establish remotely accessible // return path (sender) val kernel = kernels.get(Actor.self) match { case None => { val serv = new TcpService(TcpService.generatePort) serv.start() kernels += Actor.self -> serv.kernel serv.kernel } case Some(k) => k } kernel.send(node, sym, a) } case other => error("Cannot send non-AnyRef value remotely.") } } } /** * This class represents a machine node on a TCP network. * * @author Philipp Haller */ case class Node(address: String, port: Int)




© 2015 - 2024 Weber Informatics LLC | Privacy Policy