cobonas

2014.12.20

Play Framework(Play2)(Scala)のTips Part3:Akkaを使った非同期/バッチ処理(Advent Calendar 20日目)

この記事はアライドアーキテクツAdvent Calendar 20日目の記事です。

どうも。伊藤(係長)です。
今日は他の方に乗っ取られる事もなく無事に書くことができます。
今回はAkkaを使った非同期処理やバッチ処理についてです。

通常、非同期処理をJavaとかで書こうと思ったら、ちょっとメンドクサイですよね。
ところがAkkaを使えば比較的簡単に書く事ができるのです。
※私自身がこの辺の処理が苦手なので、深いところまでは全く踏み込みません。
(というか踏み込めません)

■Akkaとは
Actorによる並列処理を行う為のライブラリ。
ScalaとJavaのAPIがあり、並列処理、分散処理を簡単に記述する事が可能です。
詳しくはAkkaをご覧ください。

単純な非同期処理

事前準備

Playに最初から組み込まれている為、特に必要ありません。

実装サンプル

Akka.system.schedulerを使います。

これだけです。これだけでOk(“hoge”)が先に実行されてView側に結果を返し、
裏ではdoAsyncが1秒後に実行されます。すごい簡単ですね。
doSomethingの処理のうち、何か二次的な処理を裏でこっそりさせたい場合などに有効かと思います。
ちなみに、コード内の”1.seconds”部分は、
“2.minutes”(2分後)、”3.hours(3時間後)”など色々指定が可能です。

定期的なバッチ処理

30分おきに実行させたい処理、日次で実行させたい処理などを想定します。
ここでは、akka-quartz-schedulerを使います。
これは、予め設定しておいたスケジュールに基いてActorを起動する事ができるプラグインです。

事前準備

build.sbtに依存を追加する

build.sbt

※Play2.2環境下の設定です。適宜変更してください。

実装サンプル

1.application.confにスケジュールを設定する
application.conf

※詳しい設定方法はここをどうぞ。

2.スケジュールを登録する
GlobalSettingsを継承したGlobal.scalaを作成して、1.で設定したファイルを読み込んでスケジュールを登録する処理を書きます。

Global.scala

設定ファイルから情報を読み込んで、動的にActorを生成してスケジューリングしています。
(※ここでは”SampleActor1″、”SampleActor2″クラスが生成されます)

3.Actorのベースを書く
ActorBase.scala

4.メイン処理のActorを書く
SampleActor1.scala

この時のクラス名はapplication.confに設定したActorクラス名と一致させる必要があります。

以上の実装でスケジューリングした通りに勝手にActorが起動、実行されます。
割りと簡単に書けますよね。
※SampleActor2は割愛します。

明日は、最近さらに乗りに乗っているGit大佐こと大佐の番です!!!