アクター・プログラミングのお勉強の記録
まずは、"Apache Akka"のQuickStartを実行してみる。
ここで使用するOSは、Windows10。
JDKがインストール済であること。ここではJava8を使用。Java9だと動かなかった(後述のsbt.batが失敗する)。
Microsoft Windows [Version 10.0.16299.192]
(c) 2017 Microsoft Corporation. All rights reserved.
C:\Users\xxx>java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
C:\Users\xxx>javac -version
javac 1.8.0_112
C:\Users\xxx>
「Akka Quickstart with Scala:」に従ってサンプルをダウンロードして実行する。
Lightbend TECH HUBからダウンロードする。「Get Started with Lightbend TechnologiesのAkka Quickstart Scala:」 の「CREATE A PROJECT FOR ME!」をクリックするとzipファイルがダウンロードできる。
ダウンロードしたzipファイルを解凍する
C:xxx
├akka-quickstart-scala.zip
└akka-quickstart-scala
├_
├project
├sbt-dist
├src
├build.sbt
├sbt
└sbt.bat
コマンドプロンプトで、sbt.batの存在するフォルダに移動して、sbt.batを実行し環境作成。
C:\>cd xxx
C:\xxx>cd akka-quickstart-scala
C:\xxx\akka-quickstart-scala>cd akka-quickstart-scala
C:\xxx\akka-quickstart-scala\akka-quickstart-scala>sbt.bat
C:\xxx\akka-quickstart-scala\akka-quickstart-scala>.\sbt-dist\bin\sbt.bat
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading project definition from C:\xxx\akka-quickstart-scala\akka-quickstart-scala\project
[info] Updating {file:/C:/xxx/akka-quickstart-scala/akka-quickstart-scala/project/}akka-quickstart-scala-build...
[info] Resolving org.scala-sbt.ivy#ivy;2.3.0-sbt-48dd0744422128446aee9ac31aa356e[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] downloading https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/io.spray/sbt-revolver/scala_2.10/sbt_0.13/0.8.0/jars/sbt-revolver.jar ...
[info] [SUCCESSFUL ] io.spray#sbt-revolver;0.8.0!sbt-revolver.jar (4479ms)
[info] Done updating.
[info] Set current project to akka-quickstart-scala (in build file:/C:/xxx/akka-quickstart-scala/akka-quickstart-scala/)
>
入力待ちになるので、"reStart"を入力する。すると、サンプルプログラムの依存関係の解決とコンパイル、サンプルプログラムの実行まで一気に行われる。
> reStart
[info] Updating {file:/C:/xxx/akka-quickstart-scala/akka-quickstart-scala/}akka-quickstart-scala...
[info] Resolving jline#jline;2.14.3 ...
[info] downloading https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.2/scala-library-2.12.2.jar ...
[info] [SUCCESSFUL ] org.scala-lang#scala-library;2.12.2!scala-library.jar (2988ms)
[info] downloading https://repo1.maven.org/maven2/com/typesafe/akka/akka-actor_2.12/2.5.3/akka-actor_2.12-2.5.3.jar ...
[info] [SUCCESSFUL ] com.typesafe.akka#akka-actor_2.12;2.5.3!akka-actor_2.12.jar (1485ms)
[info] downloading https://repo1.maven.org/maven2/com/typesafe/akka/akka-testkit_2.12/2.5.3/akka-testkit_2.12-2.5.3.jar ...
[info] [SUCCESSFUL ] com.typesafe.akka#akka-testkit_2.12;2.5.3!akka-testkit_2.12.jar (531ms)
[info] downloading https://repo1.maven.org/maven2/com/typesafe/config/1.3.1/config-1.3.1.jar ...
[info] [SUCCESSFUL ] com.typesafe#config;1.3.1!config.jar(bundle) (549ms)
[info] downloading https://repo1.maven.org/maven2/org/scala-lang/modules/scala-java8-compat_2.12/0.8.0/scala-java8-compat_2.12-0.8.0.jar ...
[info] [SUCCESSFUL ] org.scala-lang.modules#scala-java8-compat_2.12;0.8.0!scala-java8-compat_2.12.jar(bundle) (797ms)
[info] downloading https://repo1.maven.org/maven2/org/scalatest/scalatest_2.12/3.0.1/scalatest_2.12-3.0.1.jar ...
[info] [SUCCESSFUL ] org.scalatest#scalatest_2.12;3.0.1!scalatest_2.12.jar(bundle) (2816ms)
[info] downloading https://repo1.maven.org/maven2/org/scalactic/scalactic_2.12/3.0.1/scalactic_2.12-3.0.1.jar ...
[info] [SUCCESSFUL ] org.scalactic#scalactic_2.12;3.0.1!scalactic_2.12.jar(bundle) (844ms)
[info] downloading https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.2/scala-reflect-2.12.2.jar ...
[info] [SUCCESSFUL ] org.scala-lang#scala-reflect;2.12.2!scala-reflect.jar (1394ms)
[info] downloading https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.5/scala-xml_2.12-1.0.5.jar ...
[info] [SUCCESSFUL ] org.scala-lang.modules#scala-xml_2.12;1.0.5!scala-xml_2.12.jar(bundle) (625ms)
[info] downloading https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.0.4/scala-parser-combinators_2.12-1.0.4.jar ...
[info] [SUCCESSFUL ] org.scala-lang.modules#scala-parser-combinators_2.12;1.0.4!scala-parser-combinators_2.12.jar(bundle) (687ms)
[info] downloading https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.2/scala-compiler-2.12.2.jar ...
[info] [SUCCESSFUL ] org.scala-lang#scala-compiler;2.12.2!scala-compiler.jar (3113ms)
[info] Compiling 1 Scala source to C:\xxx\akka-quickstart-scala\akka-quickstart-scala\target\scala-2.12\classes...
[info] 'compiler-interface' not yet compiled for Scala 2.12.2. Compiling...
[info] Compilation completed in 44.847 s
[info] Application akka-quickstart-scala not yet started
[info] Starting application akka-quickstart-scala in the background ...
akka-quickstart-scala Starting com.lightbend.akka.sample.AkkaQuickstart.main()
[success] Total time: 83 s, completed 2018/02/10 9:17:32
> akka-quickstart-scala [INFO] [02/10/2018 09:17:35.465] [helloAkka-akka.actor.default-dispatcher-5] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/goodDayGreeter#-1405489160]): Good day, Play
akka-quickstart-scala [INFO] [02/10/2018 09:17:35.465] [helloAkka-akka.actor.default-dispatcher-5] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/helloGreeter#-1268534442]): Hello, Scala
akka-quickstart-scala [INFO] [02/10/2018 09:17:35.465] [helloAkka-akka.actor.default-dispatcher-5] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/howdyGreeter#570966827]): Howdy, Akka
akka-quickstart-scala [INFO] [02/10/2018 09:17:35.465] [helloAkka-akka.actor.default-dispatcher-5] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/howdyGreeter#570966827]): Howdy, Lightbend
最後の4行が、サンプルプログラムの実行結果。
akka-quickstart-scala [INFO] [02/10/2018 09:17:35.465] [helloAkka-akka.actor.default-dispatcher-5] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/goodDayGreeter#-1405489160]): Good day, Play
2回目以降は、こんな感じ。
[success] Total time: 1 s, completed 2018/02/10 12:06:37
> akka-quickstart-scala [INFO] [02/10/2018 12:06:42.412] [helloAkka-akka.actor.default-dispatcher-4] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/goodDayGreeter#-151293539]): Good day, Play
akka-quickstart-scala [INFO] [02/10/2018 12:06:42.414] [helloAkka-akka.actor.default-dispatcher-4] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/howdyGreeter#1303624164]): Howdy, Akka
akka-quickstart-scala [INFO] [02/10/2018 12:06:42.414] [helloAkka-akka.actor.default-dispatcher-4] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/helloGreeter#-2025109673]): Hello, Scala
akka-quickstart-scala [INFO] [02/10/2018 12:06:42.414] [helloAkka-akka.actor.default-dispatcher-4] [akka://helloAkka/user/printerActor] Greeting received (from Actor[akka://helloAkka/user/howdyGreeter#1303624164]): Howdy, Lightbend
Git上にMinaをendpointにする例が掲載されている。以下は、解析結果をメモ。
掲載場所:akka-mina-tcp-server
クライアント→Minaハンドラー→Akkaアクター→Mina→クライアントという流れ。
Minaに、Akkaを埋め込むイメージ。とりあえずMina単独で作って、Akkaで拡張する手順でよさそう。
この例は、sbtではなく、gradleを使っている。
オリジナルの動作をtelnetで確認後、print文をアクターとハンドラーに追記し、AKKAアクターとMINAハンドラーが非同期に動作していることを確認した。
Akka remote ... routing ... stream ... cluster ... 永続化 ... endpoint(Apache mina) ... Play2 ... Kafka