§Akka の統合
Akka は抽象レベルを上げるためにアクターモデルを利用し、正しい平行処理のスケーラブルなアプリケーションを構築するためにより良いプラットフォームを提供します。耐障害性を確保するために、通信業界において、自己回復することで決して停止することがないアプリケーションの構築で大きな成功をおさめている ‘Let it crash’ という設計モデルを採用しています。また、アクターモデルは透過的な分散環境や本当にスケーラブルで耐障害性の高いアプリケーションのための抽象化も提供します。
§アプリケーションのアクターシステム
Akka 2.0 は アクターシステム
と呼ばれるいくつかのコンテナを持ちます。それぞれのアクターシステムは、それに含まれるアクターを動かすためのリソースを管理します。
Play アプリケーションには、アプリケーション自身が使う特別なアクターシステムが定義されています。このアクターシステムはアプリケーションのライフサイクルに追従し、アプリケーションと共に自動的に再起動します。
Note: 独自のアクターシステムを利用しても全く問題ありません。デフォルトのアクターシステムは、実行するアクターの数が少なく、別のアクター・システムを自分で用意するまでもないような場合に利用するとよいでしょう。
アプリケーションのデフォルトのアクターシステムを利用するためには、play.api.libs.concurrent.Akka
ヘルパーを利用します。
val myActor = Akka.system.actorOf(Props[MyActor], name = "myactor")
§設定
デフォルトのアクターシステムの設定は、Play アプリケーションの設定ファイルから読み込まれます。例えば、アプリケーションのアクターシステムのデフォルトディスパッチャを変更したい場合は、 conf/application.conf
ファイルにその設定を数行追加します。
akka.default-dispatcher.fork-join-executor.pool-size-max =64
akka.actor.debug.receive = on
Note: Akka の規約に基づいて設定ファイルにトップの設定キーを記述することで、同じファイル内で全く別のアクターシステムを構成することもできます。
§非同期タスクのスケジューリング
Akka では、アクターへのメッセージ送信やタスク(関数または Runnable
)の実行を予約することができます。予約を行うと、結果として Cancellable
のインスタンスが返ってきます。その cancel
メソッドを呼び出すことで、予約した操作の実行をキャンセルすることができます。
例えば、testActor
というアクターに 30 マイクロ秒毎にメッセージを送信するにはこのようにします:
import play.api.libs.concurrent.Execution.Implicits._
Akka.system.scheduler.schedule(0.microsecond, 300.microsecond, testActor, "tick")
Note: この例では
scala.concurrent.duration
に定義されている implicit conversion を利用して、数値を時間単位の異なるDuration
オブジェクトへ変換しています。
同様に、コードブロックを今から 1 秒後に実行するには、次のように書きます:
import play.api.libs.concurrent.Execution.Implicits._
Akka.system.scheduler.scheduleOnce(1000.microsecond) {
file.delete()
}
次ページ: 多言語対応