Akka
AkkaというJava/Scala向けのライブラリがある。Javaで書くと記述量的にかなり厳しいので、実質Scala向けと思っていいだろう。
いろいろな機能があるらしいのだけど、一番喧伝されているのはActorライブラリ。Actorというのは1970年代に提唱された計算モデルで、並列オブジェクト指向記述に相性がいいというので、80年代には盛んに研究されていた。最近だとYahooのS4がやはりActorモデルに基づいていると言っているようだ。いまとなっては別に取り立ててどうというモデルでもなく、Actorにメッセージを送るとActorの内部状態が変わる、というだけのはなしだと思えば当たらずとも遠からず。
ほかにもSoftware Transactional Memory やDataflow 変数なんてのも。後者は、いわゆる単一代入変数だ。httpサーバも内蔵されていて、Cometなんかもつかえるらしい。
インストール
インストールはこのページにしたがってSBTでやってみた。
project/plugins/Plugins.scala に以下のように書く。するとAkkaProjectというtraitが定義されるらしい。
import sbt._ class Plugins(info: ProjectInfo) extends PluginDefinition(info) { val akkaRepo = "Akka Repo" at "http://akka.io/repository" val akkaPlugin = "se.scalablesolutions.akka" % "akka-sbt-plugin" % "1.0" }
で プロジェクトでtraitを参照する。 Akkaの各昨日は、akkaModuleメソッドを用いて、ここでのakkaStm, AkkaRemoteのようにモジュールごとに読み込む。ちなみにactorはデフォルトで入るのだそうだ。
import sbt._ class MyProject(info: ProjectInfo) extends DefaultProject(info) with AkkaProject { val akkaStm = akkaModule("stm") val akkaRemote = akkaModule("remote") }
で、reload, update すればOK。
remote actor
せっかくなのでremote actorを動かしてみる。
サーバコード。
import akka.actor.Actor import akka.actor.Actor._ class HelloWorldActor extends Actor { def receive = { case msg => print(msg); self reply (msg + " World") } } object Server { def main(args: Array[String]) { remote.start("localhost", 9999).register( "hello-service", actorOf[HelloWorldActor]) } }
クライアントコード
import akka.actor.Actor import akka.actor.Actor._ object Client { def main(args: Array[String]) { val actor = remote.actorFor( "hello-service", "localhost", 9999) val result = actor !! "Hello" print(result) } }
Serverを起動しておいて Clientを起動すると大量のログが出て何となく動いてるのがわかる。
所感
はっきり言ってこの程度のコードだと全くありがたみがないなあ。SBTとかもいじってみよう。