SlideShare a Scribd company logo
1 of 12
Akkaのreceiveと
Scala・Javaの違い
前多賢太郎 @kencharos
内容
 自己紹介
 Akka の receive は何?
 部分関数とは
 Akka (Java)のreceiveについて
自己紹介
 前多賢太郎 (@kencharos)
 ウルシステムズ株式会社所属
 Javaプログラマー
 最近の仕事
 Spring(boot)のアプリケーション構築・教育
 Playframework(Java) + Cassandra 案件の技術コンサル
 好きなAWSサービス: Lambda
 仕事以外
 Scala 独学中
 akka-doc-jaに参加中(みなさんもぜひ)
 https://github.com/akka-ja/akka-doc-ja
akka の receive を見たとき
 俺の知ってる 関数の定義と何か違う
 いきなり始まる case とパターンマッチ
 メッセージを処理する関数なのに引数は? 戻り値は?
 パターンマッチに該当しない場合の処理は?
// Actor#receive
def receive = {
case "ping" => {
sender ! "pong"
}
}
// 普通の関数
def func(x:String) = {
"Hello" + x
}
def receive の定義
 receiveは Receive型の戻り値を返す引数なしの抽象メソッド
 Receive型は, PartialFunction[Any, Unit] 型のエイリアス
 つまり、 receiveの中身は、PartialFunction の定義
 PartialFunction?
def receive: Actor.Receive
type Receive = PartialFunction[Any, Unit]
PartialFunction(部分関数) とは?
 特定の引数について任意の処理を行うオブジェクト
 特定の引数と処理の組を、パターンマッチの一覧で定義
できる
 通常の関数のように呼び出せるが、マッチしない引数だ
とエラー
def pfSample:PartialFunction[String, Unit] = {
case "John" => println("hello Jhon")
case "Tony" => println("Get out! Tony")
}
pfSample("Jhon") // "hello!"
pfSample("Tony") // "get out!"
pfSample("Michel") // 実行時エラー
PartialFunctionの便利機能
 マッチしない引数の確認やデフォルト処理を設定できる
 Akka の場合、 applyOrElse で、receiveで処理できないメッ
セージをunhandled メソッドで処理している
 unhandledを通して、アクターの終了検知やデッドレター送付など共通処
理を行っている
if (pfSample.isDefinedAt("Michel")) {
pfSample("Michel")
} else {
"strange!"
}
pfSample.applyOrElse("Michel",
(name:String) => s"${name} is stranger!")
protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit =
receive.applyOrElse(msg, unhandled)
PartialFunctionであることを生かす
 PartialFunctionは合成できる
 各アクターを横断して行うメッセージの処理を traitなどで
定義して、各アクターのreceiveに合成できる
 詳しくは↓
http://doc.akka.io/docs/akka/current/scala/actors.html#Extendi
ng_Actors_using_PartialFunction_chaining
trait CommonProcess {
this: Actor =>
val greeting :Receive = {
case "Greeting" =>
sender ! s"Hello! I am ${self.path.name}"
}
}
class SomeActor extends Actor with CommonProcess{
def receive = greeting orElse {
case "ping" => {
sender ! "pong"
}
}
}
Java版だとどうなの?
Java の場合 unhandledを自分で呼ぶ
 Java(UntypedActor)の場合、unhandledの明示的な呼び出
しが必要
 Scalaと同じように書けなくてつらい
 でもAkkaでunhandledを呼ばせるには、メッセージ判定と
メッセージ処理の2つの抽象メソッドをほぼ同じ内容で定
義する必要がある
@Override
public void onReceive(Object message) throws Exception {
if ((message instanceof String) && ((String)message).equals("Ping")) {
getSender().tell("Pong", getSelf());
} else {
unhandled(message);
}
}
将来的には改善されるかも?
 lambda support (experimental) で、パターンマッチ相当
の機能が提供されるかも
 http://doc.akka.io/docs/akka/current/java/lambda-actors.html
まとめ
 Akka (Scala) は Scala の文法や機能を駆使して、書き易
いAPI を提供している
 パターンマッチ、PartialFunction、Implicit parameter, traitなど
 Akka (Java) もがんばってはいるが、型推論とパターン
マッチがないと書いていてつらい
 unhandledの明示も抜けを防ぐ仕組みが無いのでつらい
 私見だがScala・Java を使い分けるなら次のような感じ
 全面的に Akka を採用するアプリケーション => Scala
 既存Javaシステムの一部にAkka を組み込む => Java

More Related Content

What's hot

実践Akka
実践Akka実践Akka
実践AkkaHuy Do
 
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けーTanUkkii
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksKazuhiro Sera
 
Real world android akka
Real world android akkaReal world android akka
Real world android akkaTaisuke Oe
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめtakezoe
 
JavaからScalaへ
JavaからScalaへJavaからScalaへ
JavaからScalaへtakezoe
 
Developing an Akka Edge6
Developing an Akka Edge6Developing an Akka Edge6
Developing an Akka Edge6saaaaaaki
 
Developing an Akka Edge1-3
Developing an Akka Edge1-3Developing an Akka Edge1-3
Developing an Akka Edge1-3saaaaaaki
 
ScalaにまつわるNewsな話
ScalaにまつわるNewsな話ScalaにまつわるNewsな話
ScalaにまつわるNewsな話Yosuke Mizutani
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!K Kinzal
 
Scala.jsはじめました?
Scala.jsはじめました?Scala.jsはじめました?
Scala.jsはじめました?K Kinzal
 
SIerでScalaを使うために私がしたこと
SIerでScalaを使うために私がしたことSIerでScalaを使うために私がしたこと
SIerでScalaを使うために私がしたことtakezoe
 
ネタじゃないScala.js
ネタじゃないScala.jsネタじゃないScala.js
ネタじゃないScala.jstakezoe
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconKazuhiro Sera
 
AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤Godai Nakamura
 
Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座都元ダイスケ Miyamoto
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
Developing an Akka Edge4-5
Developing an Akka Edge4-5Developing an Akka Edge4-5
Developing an Akka Edge4-5saaaaaaki
 

What's hot (20)

実践Akka
実践Akka実践Akka
実践Akka
 
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けープログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
プログラミング言語のパラダイムシフト(ダイジェスト)ーScalaから見る関数型と並列性時代の幕開けー
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ks
 
Real world android akka
Real world android akkaReal world android akka
Real world android akka
 
Scala警察のすすめ
Scala警察のすすめScala警察のすすめ
Scala警察のすすめ
 
JavaからScalaへ
JavaからScalaへJavaからScalaへ
JavaからScalaへ
 
Developing an Akka Edge6
Developing an Akka Edge6Developing an Akka Edge6
Developing an Akka Edge6
 
Developing an Akka Edge1-3
Developing an Akka Edge1-3Developing an Akka Edge1-3
Developing an Akka Edge1-3
 
ScalaにまつわるNewsな話
ScalaにまつわるNewsな話ScalaにまつわるNewsな話
ScalaにまつわるNewsな話
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!
 
Scala.jsはじめました?
Scala.jsはじめました?Scala.jsはじめました?
Scala.jsはじめました?
 
SIerでScalaを使うために私がしたこと
SIerでScalaを使うために私がしたことSIerでScalaを使うために私がしたこと
SIerでScalaを使うために私がしたこと
 
ネタじゃないScala.js
ネタじゃないScala.jsネタじゃないScala.js
ネタじゃないScala.js
 
実戦Scala
実戦Scala実戦Scala
実戦Scala
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
 
AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤AWSオンリーで実現するIoTクラウド基盤
AWSオンリーで実現するIoTクラウド基盤
 
Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座Single Command Deployのための gradle-aws-plugin講座
Single Command Deployのための gradle-aws-plugin講座
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
Developing an Akka Edge4-5
Developing an Akka Edge4-5Developing an Akka Edge4-5
Developing an Akka Edge4-5
 

Viewers also liked

明日から業務で使うScala
明日から業務で使うScala明日から業務で使うScala
明日から業務で使うScalamartin_lover_ca
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
ホットペッパービューティーアプリリプレイスとMVCP
ホットペッパービューティーアプリリプレイスとMVCPホットペッパービューティーアプリリプレイスとMVCP
ホットペッパービューティーアプリリプレイスとMVCPRecruit Lifestyle Co., Ltd.
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016Yota Ishida
 
【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略naoto kyo
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介Recruit Technologies
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on ScalaTanUkkii
 
Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]Shinichi Kozake
 
DSLの使い所
DSLの使い所DSLの使い所
DSLの使い所disc99_
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!Brendan Eich
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアルK Yamaguchi
 
AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介
AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介
AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介Amazon Web Services Japan
 
Yahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnight
Yahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnightYahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnight
Yahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnightYahoo!デベロッパーネットワーク
 
Why Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your ShellWhy Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your Shelljaguardesignstudio
 

Viewers also liked (20)

明日から業務で使うScala
明日から業務で使うScala明日から業務で使うScala
明日から業務で使うScala
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
ホットペッパービューティーアプリリプレイスとMVCP
ホットペッパービューティーアプリリプレイスとMVCPホットペッパービューティーアプリリプレイスとMVCP
ホットペッパービューティーアプリリプレイスとMVCP
 
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
ディープラーニングでおそ松さんの6つ子は見分けられるのか? FIT2016
 
【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略【講演資料】激変する自動車業界におけるクルマ屋の戦略
【講演資料】激変する自動車業界におけるクルマ屋の戦略
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介
 
Architecture of Falcon, a new chat messaging backend system build on Scala
Architecture of Falcon,  a new chat messaging backend system  build on ScalaArchitecture of Falcon,  a new chat messaging backend system  build on Scala
Architecture of Falcon, a new chat messaging backend system build on Scala
 
Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]Kotlinで関数拡張しちゃうぞ![修正版]
Kotlinで関数拡張しちゃうぞ![修正版]
 
DSLの使い所
DSLの使い所DSLの使い所
DSLの使い所
 
Smart World
Smart WorldSmart World
Smart World
 
Akka stream
Akka streamAkka stream
Akka stream
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 
Intelligent world
Intelligent worldIntelligent world
Intelligent world
 
Prestoクエリログの保存/分析機能の構築 #yjdsnight
Prestoクエリログの保存/分析機能の構築 #yjdsnightPrestoクエリログの保存/分析機能の構築 #yjdsnight
Prestoクエリログの保存/分析機能の構築 #yjdsnight
 
Presto in Yahoo! JAPAN #yjdsnight
Presto in Yahoo! JAPAN #yjdsnightPresto in Yahoo! JAPAN #yjdsnight
Presto in Yahoo! JAPAN #yjdsnight
 
AWS Black Belt Online Seminar Antipattern
AWS Black Belt Online Seminar AntipatternAWS Black Belt Online Seminar Antipattern
AWS Black Belt Online Seminar Antipattern
 
AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介
AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介
AWS初心者向けWebinar 失敗例を成功に変える AWSアンチパターンのご紹介
 
Yahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnight
Yahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnightYahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnight
Yahoo! JAPANが持つデータ分析ソリューションの紹介 #yjdsnight
 
Why Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your ShellWhy Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your Shell
 

Similar to 【LT】akka receive とScala Javaの違い

Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数amkt922
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
こわくないScala
こわくないScalaこわくないScala
こわくないScalaFScoward
 
Play frameworkについて
Play frameworkについてPlay frameworkについて
Play frameworkについてShinobu Okano
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみてKota Mizushima
 
ScalaでASICやFPGA用の回路を設計するChisel
ScalaでASICやFPGA用の回路を設計するChiselScalaでASICやFPGA用の回路を設計するChisel
ScalaでASICやFPGA用の回路を設計するChiselKei Nakazawa
 
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Asami Abe
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Shuya Tsukamoto
 
Next Language Scala
Next Language ScalaNext Language Scala
Next Language Scalapengin01
 
Scalaはじめました!
Scalaはじめました!Scalaはじめました!
Scalaはじめました!Asami Abe
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
Overview of Scala ~ Hacker Tackle
Overview of Scala ~ Hacker TackleOverview of Scala ~ Hacker Tackle
Overview of Scala ~ Hacker TackleDaisuke Kasuya
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Ra Zon
 
Ruby使いのためのScalaのススメ
Ruby使いのためのScalaのススメRuby使いのためのScalaのススメ
Ruby使いのためのScalaのススメOuka Yuka
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 

Similar to 【LT】akka receive とScala Javaの違い (20)

Java使いにとっての関数
Java使いにとっての関数Java使いにとっての関数
Java使いにとっての関数
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
Play frameworkについて
Play frameworkについてPlay frameworkについて
Play frameworkについて
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
ScalaでASICやFPGA用の回路を設計するChisel
ScalaでASICやFPGA用の回路を設計するChiselScalaでASICやFPGA用の回路を設計するChisel
ScalaでASICやFPGA用の回路を設計するChisel
 
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
 
Survey of Apache Spark
Survey of Apache SparkSurvey of Apache Spark
Survey of Apache Spark
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
 
Next Language Scala
Next Language ScalaNext Language Scala
Next Language Scala
 
ScalaCL in ScalaKaigi
ScalaCL in ScalaKaigiScalaCL in ScalaKaigi
ScalaCL in ScalaKaigi
 
Scalaはじめました!
Scalaはじめました!Scalaはじめました!
Scalaはじめました!
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
Overview of Scala ~ Hacker Tackle
Overview of Scala ~ Hacker TackleOverview of Scala ~ Hacker Tackle
Overview of Scala ~ Hacker Tackle
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
 
Ruby使いのためのScalaのススメ
Ruby使いのためのScalaのススメRuby使いのためのScalaのススメ
Ruby使いのためのScalaのススメ
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 

【LT】akka receive とScala Javaの違い

  • 2. 内容  自己紹介  Akka の receive は何?  部分関数とは  Akka (Java)のreceiveについて
  • 3. 自己紹介  前多賢太郎 (@kencharos)  ウルシステムズ株式会社所属  Javaプログラマー  最近の仕事  Spring(boot)のアプリケーション構築・教育  Playframework(Java) + Cassandra 案件の技術コンサル  好きなAWSサービス: Lambda  仕事以外  Scala 独学中  akka-doc-jaに参加中(みなさんもぜひ)  https://github.com/akka-ja/akka-doc-ja
  • 4. akka の receive を見たとき  俺の知ってる 関数の定義と何か違う  いきなり始まる case とパターンマッチ  メッセージを処理する関数なのに引数は? 戻り値は?  パターンマッチに該当しない場合の処理は? // Actor#receive def receive = { case "ping" => { sender ! "pong" } } // 普通の関数 def func(x:String) = { "Hello" + x }
  • 5. def receive の定義  receiveは Receive型の戻り値を返す引数なしの抽象メソッド  Receive型は, PartialFunction[Any, Unit] 型のエイリアス  つまり、 receiveの中身は、PartialFunction の定義  PartialFunction? def receive: Actor.Receive type Receive = PartialFunction[Any, Unit]
  • 6. PartialFunction(部分関数) とは?  特定の引数について任意の処理を行うオブジェクト  特定の引数と処理の組を、パターンマッチの一覧で定義 できる  通常の関数のように呼び出せるが、マッチしない引数だ とエラー def pfSample:PartialFunction[String, Unit] = { case "John" => println("hello Jhon") case "Tony" => println("Get out! Tony") } pfSample("Jhon") // "hello!" pfSample("Tony") // "get out!" pfSample("Michel") // 実行時エラー
  • 7. PartialFunctionの便利機能  マッチしない引数の確認やデフォルト処理を設定できる  Akka の場合、 applyOrElse で、receiveで処理できないメッ セージをunhandled メソッドで処理している  unhandledを通して、アクターの終了検知やデッドレター送付など共通処 理を行っている if (pfSample.isDefinedAt("Michel")) { pfSample("Michel") } else { "strange!" } pfSample.applyOrElse("Michel", (name:String) => s"${name} is stranger!") protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = receive.applyOrElse(msg, unhandled)
  • 8. PartialFunctionであることを生かす  PartialFunctionは合成できる  各アクターを横断して行うメッセージの処理を traitなどで 定義して、各アクターのreceiveに合成できる  詳しくは↓ http://doc.akka.io/docs/akka/current/scala/actors.html#Extendi ng_Actors_using_PartialFunction_chaining trait CommonProcess { this: Actor => val greeting :Receive = { case "Greeting" => sender ! s"Hello! I am ${self.path.name}" } } class SomeActor extends Actor with CommonProcess{ def receive = greeting orElse { case "ping" => { sender ! "pong" } } }
  • 10. Java の場合 unhandledを自分で呼ぶ  Java(UntypedActor)の場合、unhandledの明示的な呼び出 しが必要  Scalaと同じように書けなくてつらい  でもAkkaでunhandledを呼ばせるには、メッセージ判定と メッセージ処理の2つの抽象メソッドをほぼ同じ内容で定 義する必要がある @Override public void onReceive(Object message) throws Exception { if ((message instanceof String) && ((String)message).equals("Ping")) { getSender().tell("Pong", getSelf()); } else { unhandled(message); } }
  • 11. 将来的には改善されるかも?  lambda support (experimental) で、パターンマッチ相当 の機能が提供されるかも  http://doc.akka.io/docs/akka/current/java/lambda-actors.html
  • 12. まとめ  Akka (Scala) は Scala の文法や機能を駆使して、書き易 いAPI を提供している  パターンマッチ、PartialFunction、Implicit parameter, traitなど  Akka (Java) もがんばってはいるが、型推論とパターン マッチがないと書いていてつらい  unhandledの明示も抜けを防ぐ仕組みが無いのでつらい  私見だがScala・Java を使い分けるなら次のような感じ  全面的に Akka を採用するアプリケーション => Scala  既存Javaシステムの一部にAkka を組み込む => Java

Editor's Notes

  1. Instanceof は割愛