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とかもいじってみよう。