FutureメソッドとQueueableクラスは、Salesforceで非同期処理を行うための仕組みです。
それぞれの特徴と使い方について説明します。
1. Futureメソッド
Futureメソッドは、非同期で軽量な処理を実行する際に使用します。
特徴
- 軽量: 簡単に非同期処理を設定できる。
- 単一のトランザクション: 実行される処理は完全に独立している。
-
コールアウト対応:
@future(callout=true)を指定すると、外部API呼び出しが可能。 -
制限事項:
- メソッドの引数はプリミティブ型(例:
String,Integer)かコレクション型(例:List<String>)のみ。 - メソッドから戻り値を取得できない。
- コンテキスト情報(ジョブIDなど)を追跡するのが難しい。
- メソッドの引数はプリミティブ型(例:
例
Futureメソッドの宣言
public class FutureExample {
@future(callout=true)
public static void executeFuture(String accountId) {
// 外部APIコールアウトなどの処理
System.debug('Executing future method for Account ID: ' + accountId);
}
}
トリガやクラスからの呼び出し
trigger AccountTrigger on Account (after insert) {
for (Account acc : Trigger.new) {
FutureExample.executeFuture(acc.Id);
}
}
2. Queueableクラス
Queueableクラスは、非同期で複雑な処理や、状態管理が必要な処理を行う場合に使用します。
特徴
- 状態管理: 非同期ジョブの処理状況を追跡可能(ジョブIDを取得できる)。
- 柔軟な引数: クラスのコンストラクタで任意の型を引数に受け取れる。
-
コールアウト対応:
Database.AllowsCalloutsインターフェースを実装すれば外部API呼び出し可能。 -
連鎖処理:
System.enqueueJob()を使って、別のQueueableジョブをキューに追加可能。 -
制限事項:
- 同じQueueableクラスの連鎖呼び出しは50回まで。
- 扱えるレコード数は1回の実行で50,000件まで。
例
Queueableクラスの作成
public class QueueableExample implements Queueable, Database.AllowsCallouts {
private String accountId;
// コンストラクタ
public QueueableExample(String accountId) {
this.accountId = accountId;
}
// executeメソッド
public void execute(QueueableContext context) {
System.debug('Executing queueable job for Account ID: ' + accountId);
// 外部API呼び出しや複雑な処理を実行
}
}
ジョブの登録
trigger AccountTrigger on Account (after insert) {
for (Account acc : Trigger.new) {
System.enqueueJob(new QueueableExample(acc.Id));
}
}
ジョブIDの取得
Id jobId = System.enqueueJob(new QueueableExample('0015g00000xxxxx'));
System.debug('Queueable Job ID: ' + jobId);
Futureメソッド vs Queueableクラス
| 項目 | Futureメソッド | Queueableクラス |
|---|---|---|
| 柔軟性 | 少ない | 高い |
| 引数 | プリミティブ型、コレクション | 任意の型(カスタムクラス含む) |
| 戻り値 | なし | ジョブIDで追跡可能 |
| ジョブ連鎖 | 不可能 | 可能 |
| コールアウト | 可能(@future(callout=true)) |
可能(Database.AllowsCallouts) |
| 追跡可能性 | 低い | 高い |
| 主な用途 | 軽量でシンプルな処理 | 複雑で連鎖的な処理 |
どちらを使うべきか?
- シンプルで軽量な非同期処理が必要 → Futureメソッド
- 複雑な処理や状態管理が必要 → Queueableクラス
例: 外部API呼び出しの場合
- 簡単な外部APIコールアウト: Futureメソッド
- 複数のステップを伴うAPIコールアウト: Queueableクラス
用途に応じて使い分けましょう!