Akka Remote Typed Actor
Akka はPOJOをActorとして扱うことができる。要するに普通のRMIと同じだが。。。
サーバ側
trait を定義しておいて、それを実装したImplを定義する。
import akka.actor.Actor import akka.actor.Actor._ import akka.actor.TypedActor import akka.actor.Actors trait HelloService { def hello(s: String) : String } class HelloServiceImpl extends TypedActor with HelloService { def hello(s: String) = "hello " + s }
このときにTypedActorを拡張する。Akkaのドキュメントではこれをもって「POJOをActorにすることができる」と書いているんだけど、こういう特定のクラスを拡張したものをPOJOっていうんだっけ?実装的にもAspectWerkzとか使っているようなのだけど、それならなおさらなんでTypedActorクラスを拡張しなくちゃなんないのかわからない。不思議。
で、リモートオブジェクトとして登録する。
object ServerTyped { def main(args: Array[String]) { val service = TypedActor.newInstance( classOf[HelloService], classOf[HelloServiceImpl], 1000) remote.start("localhost", 9999). registerTypedActor("hello-service", service) } }
クライアント側
こちら側は、参照を取り出して、呼び出しているだけ。
import akka.actor.Actor import akka.actor.Actor._ object ClientTyped { def main(args: Array[String]) { val hello = remote.typedActorFor(classOf[HelloService], "hello-service", 5000L, "localhost", 9999) println(hello.hello("world")) } }