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)
  }
}