『Force.com 開発 』カテゴリの新機能です。新しく非同期処理を行うためのQueueable インターフェースが追加されました。
非同期処理といえばfuture メソッドがありましたが、Queueable インターフェースの場合、AsyncApexJobオブジェクトに対してクエリを実行することで、ジョブの進捗状況を確認することができます。
基本的な処理の書き方はこんな感じです。
これでQueueable インターフェースを実装するクラスが用意できます。
Apexクラスから次のように呼び出して処理を実行できます。
処理実行後は次のクエリで進捗状況を取得できます。
簡単なサンプルコードをつくって試してみました。(バッチリ動くものを用意したかったのですが、テストクラスのエラーが解決できませんでした。。)
ページを開くとボタンが表示されます。
Executeボタンをクリックすると非同期処理が実行され、その時点でのステータスが表示されます。
Refreshボタンで再度クエリを実行し、最新のステータスを表示します。
状況が完了になれば、処理が終了しています。確認はしていませんが、エラーが発生した場合は失敗の件数が1以上になると思います。
サンプルコードでは取引先を登録する処理を実行するので、ステータスが完了になったあと取引先をみてみるときちんと登録されていることが確認できると思います。
あまり関係ないですが、設定のApexジョブでも実行状況は確認できます。
サンプルではリフレッシュボタンをクリック時に最新ステータスを取得するようにしていますが、apex:actionPollerと組み合わせたりするとおもしろいかなと思いました。
あと覚えておいたほうがよさそうなのは以下のとおりです。
キュー可能 Apex の制限
- キュー内のジョブの実行は、非同期 Apex メソッド実行の共有制限値に対して 1 回カウントされます。
- 1 つのトランザクションで System.enqueueJob を使用してキューに追加できるのは、最大 50 ジョブです。
- チェーニングされたジョブの最大スタック深度は 2 です。つまり、チェーン内のジョブ数は最大 2 個です。
- ジョブをチェーニングするとき、既存のジョブから System.enqueueJob で追加できるジョブは 1 つのみです。