tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:『Winter'15新機能』Queueable インターフェースで非同期処理

『Force.com 開発 』カテゴリの新機能です。新しく非同期処理を行うためのQueueable インターフェースが追加されました。


非同期処理といえばfuture メソッドがありましたが、Queueable インターフェースの場合、AsyncApexJobオブジェクトに対してクエリを実行することで、ジョブの進捗状況を確認することができます。


基本的な処理の書き方はこんな感じです。
f:id:tyoshikawa1106:20141116161234p:plain

これでQueueable インターフェースを実装するクラスが用意できます。


Apexクラスから次のように呼び出して処理を実行できます。

f:id:tyoshikawa1106:20141116161346p:plain


処理実行後は次のクエリで進捗状況を取得できます。

f:id:tyoshikawa1106:20141116161434p:plain


簡単なサンプルコードをつくって試してみました。(バッチリ動くものを用意したかったのですが、テストクラスのエラーが解決できませんでした。。)

Queueable インターフェースの実装サンプル


ページを開くとボタンが表示されます。

f:id:tyoshikawa1106:20141116161646p:plain


Executeボタンをクリックすると非同期処理が実行され、その時点でのステータスが表示されます。

f:id:tyoshikawa1106:20141116161757p:plain


Refreshボタンで再度クエリを実行し、最新のステータスを表示します。

f:id:tyoshikawa1106:20141116161857p:plain


状況が完了になれば、処理が終了しています。確認はしていませんが、エラーが発生した場合は失敗の件数が1以上になると思います。


サンプルコードでは取引先を登録する処理を実行するので、ステータスが完了になったあと取引先をみてみるときちんと登録されていることが確認できると思います。

f:id:tyoshikawa1106:20141116162122p:plain


あまり関係ないですが、設定のApexジョブでも実行状況は確認できます。

f:id:tyoshikawa1106:20141116162250p:plain


サンプルではリフレッシュボタンをクリック時に最新ステータスを取得するようにしていますが、apex:actionPollerと組み合わせたりするとおもしろいかなと思いました。

apex:actionPoller


あと覚えておいたほうがよさそうなのは以下のとおりです。

キュー可能 Apex の制限
  • キュー内のジョブの実行は、非同期 Apex メソッド実行の共有制限値に対して 1 回カウントされます。
  • 1 つのトランザクションで System.enqueueJob を使用してキューに追加できるのは、最大 50 ジョブです。
  • チェーニングされたジョブの最大スタック深度は 2 です。つまり、チェーン内のジョブ数は最大 2 個です。
  • ジョブをチェーニングするとき、既存のジョブから System.enqueueJob で追加できるジョブは 1 つのみです。