Akka Remote Typed Actor

AkkaPOJOを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"))

  }
}

所感

まあ、普通。これを称してTyped Actorと呼ぶセンスはちょっとよくわからないな。

ところで、eclipsescala プラグインがだいぶマシになったということだったので、heliosを新しくインストールしてnightly-build をいれて使ってみている。たしかに以前よりは安定しているけど、よくわからないassertion errorがでたりしてちょっと怖い。content assistも全く当てにならない。エラーチェックはちゃんと機能しているので、もうしばらく使ってみよう。