scala.actors.remote について
Actor をリモート呼び出しできるようにする機能ですが、いまいち使いづらいです。
内部で例外を握りつぶしているらしく、接続に失敗していても気付きません。
なので、RMI を使用した簡易版を自分で作ってみました。
package scala.actors.rmi import java.rmi.{Remote, RemoteException} import java.rmi.server.UnicastRemoteObject trait RemoteActor extends Remote { @throws(classOf[RemoteException]) def !(message: Any): Unit @throws(classOf[RemoteException]) def !?(message: Any): Any } @throws(classOf[RemoteException]) class RemoteActorImpl(actor: AbstractActor) extends UnicastRemoteObject with RemoteActor { @throws(classOf[RemoteException]) def !(message: Any): Unit = actor ! message @throws(classOf[RemoteException]) def !?(message: Any): Any = actor !? message } object RemoteActor { import java.rmi.registry.Registry class RichRegistry(registry: Registry) { def bind(symbol: Symbol, actor: AbstractActor) = registry.bind(symbol.name, new RemoteActorImpl(actor)) def lookup(symbol: Symbol) = registry.lookup(symbol.name).asInstanceOf[RemoteActor] } implicit def toRichRegistry(registry: Registry) = new RichRegistry(registry) }
以下、使用例です。
import scala.actors._ import scala.actors.Actor._ import scala.actors.rmi.RemoteActor._ import java.rmi.registry.{LocateRegistry, Registry} object Test { def main(args: Array[String]): Unit = { def server() = { val registry = LocateRegistry.createRegistry(9999) registry.bind('foo, actor{react{ case x => println("msg="+x); reply("Hi!") }}) } def client() = { val registry = LocateRegistry.getRegistry(9999) val remote = registry.lookup('foo) remote !? "Hello remote!!" } server() println(client()) System.exit(0) } }