MENU
Abo
某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Apex】futureメソッドを使ってみた

今回は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 メソッドをコールできない

はい、できません。

参考資料

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:Salesforce認定アドミニストレーター
     Salesforce認定Platformデベロッパー
     Salesforce認定上級Platformデベロッパー

コメント

コメントする

CAPTCHA


目次