今回は,Scalaで手軽に本格的な分散プログラミングができる,Akkaについて紹介したいと思います.
Akkaは現在Scalaと一緒の形でTypesafe社によって配布されています.
Scalaに標準で用意されているActor機能よりも高機能なものになっています.
シンプルなコード・設定ファイルで実際にどのようにプログラムが書けるかを,
見てみたいと思います.
サーバ側のソースコードは次のようになります.
- 《 server.scala 》
-
import akka.actor.Actor class EchoActor extends Actor { protected def receive = { case x => self.reply(x) } }
- 5行: Actorトレイトのreceiveメソッドを実装します.これがクライアントからのメッセージを受け取る部分となります.
- 6行: クライアントから受け取ったメッセージxを受けて,それをそのままクライアントへ返します.
サーバの設定ファイルは次の通りとなります.
- 《 akka.conf(サーバ側) 》
-
akka { time-unit = "seconds" enabled-modules = ["remote"] event-handler-level = "DEBUG" actor { timeout = 10 serialize-messages = on } remote { server { hostname = "localhost" port = 9999 connection-timeout = 10 message-frame-size = 20000000 # limit byte size } } }
サーバの起動は次のクラスを実行します.
- 《 boot.scala 》
-
import akka.actor.Actor._ object ServicesBooster { def main(args: Array[String]): Unit = { remote.start() remote.register("echo-service", actorOf[EchoActor]) } }
- 6行: サーバ環境を起動させます.
- 7行: サーバ環境へサービスを行うActorを名前を付けて登録します.これで,クライアントからこの名前を指定してアクセスすることができるようになります.
クライアント側のソースコードは次のようになります.
- 《 client.scala 》
-
import akka.actor.Actor class TestActor extends Actor { val echoService = remote.actorFor("echo-service", "localhost", 8888) (0 to 10).par.foreach { no => println("echo = " + (echoService !! ("echo " + no))) } } }
- 5行: リモートのActorへアクセスするためのオブジェクトを名前とホスト名,ポート名を指定して生成します.
- 8行: 生成したオブジェクトを経由してメッセージを送ります(!!の後の部分が送るメッセージの内容となっています).そして,返ってきた値を表示します.
クライアントの設定ファイルは次の通りとなります.
- 《 akka.conf(クライアント側) 》
-
akka { time-unit = "seconds" enabled-modules = ["remote"] event-handler-level = "DEBUG" actor { timeout = 10 serialize-messages = on } client { message-frame-size = 20000000 # limit byte size } }
このようなコード・設定ファイルを用意することで手軽に分散プログラミングを行うことができますので,Scalaを利用されている方は,是非,Akkaを使用してみてください.