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クラス
用途に応じて使い分けましょう!