サンプルプログラムの全体構成を以下に再掲するが、詳細に関しては前回の記事を参照していただきたい。版では、アクターは、抽象クラスのUntypedActorを継承して定義する。子アクターの定義のうち、staticメンバーのメッセージオブジェクトの定義について示す。することが推奨されている。その理由は、可変オブジェクトを他のアクターに渡して共有すると、他のアクターから状態の変更が可能になってしまうためだ。不変オブジェクトを作るには、finalフィールドと、引数を取るコンストラクタを定義すればよい。続いて、メッセージ受信時の処理を見ていく。メッセージ受信処理は、onReceiveメソッドをオーバーライドして定義する。送信元へ、メッセージ返信。}}メッセージの判定onReceiveは任意の型のメッセージを受け取るため、引数はObject型となる。違って、Javaにはパターンマッチに該当する機能が無いため、ここではinstanceof後にダウンキャストしてメッセージの型を判定し、アクセッサを呼び出してフィールドを取得している。子アクターはRequestメッセージだけを受け付けるため、ここでは受け取ったメッセージがSubActor.Request型かどうかを判定している。デフォルトのメッセージ処理を呼んでいる。子アクターは呼び出し元の親アクターに、計算結果メッセージを返信する。そのための処理が、以下のコードである。版では、次のようになっていた。版にはなかったものだ。(Scala版でgetSelf()が不要な理由は、この記事の最後で解説する。)getSelf()は自分自身のアクター参照を取得するメソッドである。第2引数はメッセージの送信者を示している。メッセージを送信するのは、自分自身(子アクター)であることを、このメッセージの受信者(今回は親アクター)に伝えている。実は、アクターのメソッド内で、getSender()で取得できるアクター参照は、tellメソッドの第2引数に設定されたアクター参照である。後で紹介する親アクターの定義でも、子アクターにメッセージを送信する際に、tellメソッドに親アクター自身の参照を与えている。そのため、上記コードのgetSender()で親アクターが取得できている。tellメソッドの引数の設定により、メッセージ送信者を自由に設定できるようになっている。続いて、親アクターの定義を見ていく。指定することにより行う。同様に、コンストラクタで生成を行ってはいけない。この詳細については今後の記事で解説する。getContext().actorOf(Props.create(SubActor.class))その他、instanceofによるメッセージ判定や、unhandledの呼び出し、tellの呼び出し方法は、先ほど示した子アクターのコードと同様だ。アプリケーションを起動するコードを紹介する。ActorSystemを作成し、親アクターを生成して、メッセージを送信していく。親アクターに対するtellメソッドの第2引数にはnullを指定している。アプリケーションの外にあるため、送信者のアクターを指定できないためだ。Scala版とJava版の違いについてScala版とJava版の差異についてまとめる。メッセージオブジェクトの定義メッセージオブジェクトは、不変オブジェクトとして定義する。getter、引数有りのコンストラクタが必要だ。Request(num:Int)のように、ケースクラスの定義だけで上記とほぼ同等の定義が可能だ。版ではパターンマッチングによる判定が使える。unhandledメソッドを呼ぶ必要がある。ここは間違いを起こしやすいので注意が必要だ。版では、tellメソッドで、送信者の指定を明示する必要がある。ここも、Scala版と大きく異なる点なので注意が必要だ。少々余談となるが、Scala版ではなぜ、これが不要になるのかを解説する。メソッドの本当の定義は以下のようになっている。メソッド引数の括弧を複数個定義できる。tellメソッド同様に、アクター参照を受け取るようになっている。版では第2引数を指定しなくてよいかというと、引数のimplicitキーワードが関係している。宣言された値から自動的に補完する機能である。context.selfこのため、!メソッドにsenderを明示的に指定しない場合は、selfが自動的に渡るようになっている。mainメソッドなど、implicit宣言がない場所で呼んだ場合は、この値がデフォルト値で設定されることになる。アクターにログ機能を追加するには、以下のようにActorLogingトレイトの多重継承を行う。トレイトの多重継承の代わりに、委譲で機能を追加する。サンプルプログラムを紹介した。版と同じAPIを提供しているため、機能の違いは無いが、JavaとScalaの言語仕様の違いによって記述の仕方はだいぶ異なる。開発メンバーの言語の習熟度や参考情報の有無などを考慮して、どちらで開発するかを選択するべきだろう。Scalaの方が多い。その理由としては、Scalaの方がパターンマッチングなどの機能を使って簡潔にプログラムを書けるからだと思われる。サンプルコードを紹介していく。アクター階層について解説を行う。アクターモデルの概要について説明した。アクターモデルとAkkaの概要XP祭り2016でエンタープライズへのアジャイル開発の導入事例を講演Cloud9の概要プロフィールid:enterprisegeeks企業システムの企画・開発に携わる技術者集団です。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。月別アーカイブはてなブログをはじめよう!enterprisegeeksさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。