SalesforceのApexには非同期処理を実装するための @future
アノテーションがあります。本記事では @future
の基本的な使い方や特徴、注意点について解説します。
@futureとは?
@future
は、Apexのメソッドを非同期に実行するためのアノテーションです。時間のかかる処理や、DMLの制約を回避する際に利用されます。
特徴
- 非同期実行:トランザクションの終了後にSalesforceが実行
- DML操作可能:ただし、トランザクションが異なる
-
Webコールアウト可能:
callout=true
を指定することで、外部APIを呼び出せる - 静的メソッドでのみ使用可能
@futureの基本的な使い方
以下のコードは @future
を使ってアカウント名を非同期で更新する例です。
コールアウトを含む@futureメソッド
外部APIを呼び出す場合は、callout=true
を指定します。
public class FutureCalloutExample {
@future(callout=true)
public static void doCallout() {
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://api.example.com/data');
request.setMethod('GET');
HttpResponse response = http.send(request);
System.debug(response.getBody());
}
}
@futureの制約
@future
メソッドを使用する際には、以下の点に注意が必要です。
- メソッドは静的である必要がある
- 戻り値を持てない(voidである必要がある)
-
パラメータはプリミティブ型またはリストのみ(
SObject
を直接渡せない) - 同一トランザクションで最大50回までしか呼び出せない
-
@future
メソッドから他の@future
メソッドを呼び出せない(ネスト不可) - トランザクション完了後に処理されるため、即時実行が保証されない
いつ@futureを使うべきか?
@future
を使うケース
- DML制限を回避したいとき
- Web APIコールアウトを非同期で実行したいとき
- 時間のかかる処理を非同期で実行したいとき
@future
を避けるべきケース
- 即時実行が必要な場合(非同期のため、処理順が保証されない)
-
複雑な非同期制御が必要な場合(
Queueable
の方が適している) -
連続的な非同期処理が必要な場合(
@future
メソッドから別の@future
メソッドは呼べない)
まとめ
sObjectやオブジェクトを引数として取ることはできませんので、そこは注意が必要ですね。
@future
も、使用する際にはガバナ制約やトランザクションの影響を考慮する必要があります。
もしより柔軟な非同期処理を行いたい場合は、@Queueable
や Apexバッチ
も検討すると良いと思います。