今回はApex非同期処理の1つである「futureメソッド」についてです。
futureメソッドとは?
非同期処理にしたいメソッドの最初に、「@future 」をつけることでそのメソッドはfutureメソッドとして認識されます。
クラス単位ではなくメソッド単位で非同期処理を指定できるのがいいですね。
そもそも非同期処理がよくわからないという方はこちらをご覧ください。
futureメソッドの構文
global class SomeClass {
@future
public static void someFutureMethod(List<Id> recordIds) {
List<Account> accounts = [Select Id, Name from Account Where Id IN :recordIds];
// process account records to do awesome stuff
}
}
上記は、trailheadから引用してきたサンプルコードになります。
非同期処理として実行したいメソッドの上部に「@future」をつけるだけですね。
簡単!
futureメソッド使用の注意点
続いて、futureメソッドを使用する際の注意点です。(この他にもありますが、特に自分が気にする点です。)
- void 型のみを返す
- 引数はプリミティブデータ型、プリミティブデータ型の配列、プリミティブデータ型のコレクションのみ
- 引数にsObject またはオブジェクトをとれない
- 24 時間あたりの future メソッドの最大呼び出し数は、250,000 または組織のユーザライセンス数の 200 倍のいずれか大きい方
- future メソッドはコールされた順序で実行されるとは限らない
- future メソッドから future メソッドをコールできない
void 型のみを返す
futureメソッドは静的メソッドである必要があるためらしいです。
引数の型の制限
futureメソッドの引数には、プリミティブデータ型、プリミティブデータ型の配列、プリミティブデータ型のコレクションのみ指定でき、オブジェクト型は取れません。
理由としては、メソッドをコールしてからそのメソッドを実行するまでの間に sObject が変更されてしまう可能性があるためです。(非同期処理なので、他の処理が動いていると時に動くことができますからね。)
参考:「プリミティブデータ型」
最大呼び出し数の制限
24 時間あたりの futureメソッドの最大呼び出し数は、250,000 または組織のユーザライセンス数の 200 倍のいずれか大きい方です。
これは組織全体の制限で、他のすべての非同期 Apex (Apex 一括処理、キュー可能 Apex、スケジュール済み Apex、および future メソッド) と共有されます。
future メソッドの実行順序
future メソッドはコールされた順序で実行されるとは限らないそうです。
トリガでfutureメソッドを呼び出すときなどに、実行順がごちゃごちゃになってしまいそう、、、
そういえば、トリガでfutureメソッドを呼び出した時に、「UNABLE_TO_LOCK_ROW」エラーがよく出てたような気がします。
future メソッドから future メソッドをコールできない
はい、できません。
コメント