夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

Akka事はじめ

こんにちは。

前回でAkka-Streamsのソースを確認していましたが、
そもそものScalaとAkka自体に対する前提知識が不足しているため、
見事にはまってしまった感じでした^^;

なので、何度かScalaを用いたAkkaの小さなアプリを作成し、
そこから広げていこうと思います。

1. Akka開発用プロジェクトの作成

まずは、Akka開発用プロジェクトの作成を行います。

ひな形となるsbt定義ファイルは下記のURLから取得します。
https://github.com/akka/akka/tree/master/akka-samples/akka-sample-main-scala

プロジェクトルートに下記の内容のbuild.sbtを作成し、IntelliJ IDEAでインポートします。
簡単に構築が完了するあたり、IntelliJ IDEAが使いやすい点ではありますね。
■build.sbt

name := "akka-exercise"

version := "0.1-SNAPSHOT"

scalaVersion := "2.10.4"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.3.4"
)

2. Akka用Hello Worldコードの作成

インポートが完了したら下記のコードを作成します。
各行のコメントはとりあえず理解用です。

■HelloWorldActor.scala

package com.github.kimutansk.akka.exercise

import akka.actor.Actor

/**
 * Akka Actor用のHello Worldクラス
 * 受け取った内容の頭にメッセージを付与してコンソールに出力する。
 *
 * @author kimutansk
 */
class HelloWorldActor extends Actor {
  override def receive: Actor.Receive = {
    case x => println("Hello world! " + x)  // 何か受信したら頭にメッセージを付与してコンソール出力
  }
}

■HelloWorldApp.scala

package com.github.kimutansk.akka.exercise

import akka.actor.{ActorSystem, Props}

/**
 * Akka Actor用のHello World起動クラス
 *
 * @author kimutansk
 */
object HelloWorldApp extends App {
  override def main(args: Array[String]): Unit = {
    val system = ActorSystem.apply("HelloWorldApp") // AkkaActorSystemを生成
    val helloWorldActor = system.actorOf(Props.apply[HelloWorldActor], "HelloWorldActor") // 空設定でHelloWorldActorを生成

    helloWorldActor ! """Test1""" // HelloWorldActorに"Test1"というメッセージを渡す
    helloWorldActor ! """Test2""" // HelloWorldActorに"Test2"というメッセージを渡す

    system.shutdown()  // AkkaActorSystemを終了
  }
}

上記のコードを作成して実行すると下記の結果が得られます。

Hello world! Test1
Hello world! Test2

HelloWorldActor自体は元々のScalaのActorと比べると記述については若干単純になった位ですが、
ActorSystemから設定を投入して生成出来たり、Systemに連動して起動終了出来るあたりが便利になっていますね。
・・・とはいえ、これだけの単純な例ですと実際の所何が嬉しいかはわからないと思います。

次回以降もう少し複雑なパターンをやっていこうと思います。