Richard Imaoka's Blog

2017年より職業Scalaプログラマになった、リチャード・伊真岡のブログです。

Akka Internals (Akkaの内部動作を知る) インストール & 最初のプログラミング

環境の準備 - Akkaを使う前にJDKとSBTを入れましょう

Akkaを使うには Akka公式のGetting Startedページ -> Prerequisitesにあるように、JDKが必要です。

AkkaはScalaからもJavaからも使えますが、Scalaを使うならSBTを入れましょう。Scalaのビルドツールとしては、SBTはデファクトスタンダードといえると思います。

プロジェクトの中身を作る

(Gitの使い方がわかる方は(こちら)richard-imaoka/akka-debug · GitHubからgit cloneしてください。)

build.sbtとproject/build.propertiesを追加

まずはこういうフォルダ構成を作っていきます。

f:id:richard-imaoka:20151006000727p:plain

フォルダエクスプローラから適当なフォルダを開き(特に好みのフォルダがなければ C:\Users\あなたの名前 を使うといいでしょう)

f:id:richard-imaoka:20151006002031p:plain

右クリック→新規作成→フォルダーから

f:id:richard-imaoka:20151006001128p:plain

"akka-debug"(プロジェクトのルートフォルダ)を作りましょう。

f:id:richard-imaoka:20151006001750p:plain

akka-debugフォルダの中に入って、同じく

  • 右クリック→新規作成→フォルダー

  • 右クリック→新規作成→テキストドキュメント

を使って…

f:id:richard-imaoka:20151006001128p:plain

f:id:richard-imaoka:20151006002638p:plain

さきほどのフォルダ構成ができたら、

f:id:richard-imaoka:20151006000727p:plain

あとはbuild.sbtとbuild.propertiesの中身を以下のように変更します。メモ帳など簡単なエディタでかまいません。

  • build.sbt
lazy val root = (project in file(".")).
  settings(
    name := "akka-debug",
    version := "1.0",
    scalaVersion := "2.11.5",
    libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.3.14" withSources() withJavadoc()
  )
  • project/build.properties
sbt.version=0.13.9

main.scalaを追加

ひたすら

  • 右クリック→新規作成→フォルダー

を繰り返して、頑張って以下のフォルダ構成を作ってください

f:id:richard-imaoka:20151006003449p:plain

出来上がったら、main.scalaの中身を以下に書き換えてください。

package com.rimaoka.sample
import akka.actor.{Actor, ActorSystem, Props}
/**
 *  Pretty simple actor just logging when initializing itself and receiving a message
 */
class LoggingActor extends Actor {
  //Print out the current thread name!
  println(Thread.currentThread().toString + " : LoggingActor is initialized")
  def receive = {
    //Print out the current thread name!
    case message: String => println(Thread.currentThread().toString + s" : Message = $message" )
  }
}
/**
 *  Pretty simple object, which has the main method to run
 */
object ActorDebuggerMain {
  /**
   *  1. Create an ActorSystem
   *  2. Create an Actor (LoggingActor)
   *  3. Send a message to the actor, created in 2.
   *  4. Shuts down the system for proper exit
   */
  def main(args: Array[String]): Unit ={
    //Print out the current thread name!
    println(Thread.currentThread().toString + " : ActorDebuggerMain.main() running" )
    val system = ActorSystem("ActorDebuggerSystem")
    val actor  = system.actorOf(Props[LoggingActor])
    actor ! "Message from main()"
    Thread.sleep(500);
    system.shutdown()
  }
}

さあ、走らせましょう!!

コマンドプロンプトを開いてsbtと入力し、しばらくすると

C:\Users\rimaoka\akka-debug>sbt
...
...

「対話モード」になって、この状態でコマンドプロンプトが待ち受け状態になります

>

そこで、runと入力すればさきほどのmain.scalaを走らせることができます

> run
...
...
[info] Running ActorDebuggerMain
Thread[run-main-0,5,run-main-group-0] : ActorDebuggerMain.main() running
Thread[ActorDebuggerSystem-akka.actor.default-dispatcher-4,5,run-main-group-0] : LoggingActor is initialized
Thread[ActorDebuggerSystem-akka.actor.default-dispatcher-4,5,run-main-group-0] : Message = Message from man()
[success] Total time: 7 s, completed 2015/10/05 23:51:04

ActorDebuggerMainが以下のMainスレッドで実行され

*Thread[run-main-0,5,run-main-group-0]

LoggingActorは以下のスレッド、すなわち別スレッドで実行されていることがわかります。

*Thread[ActorDebuggerSystem-akka.actor.default-dispatcher-4,5,run-main-group-0]