
【API連携】「Callout loop detected」エラーの防止方法
Salesforceで外部APIと連携する際に、「Callout loop detected」というエラーが発生することがあります。このエラーは、同じトランザクション内でAPIコールアウトが無限ループしてしまった場合 に発生します。
本記事では、このエラーの原因と、適切な防止策について詳しく解説します。
1. エラーの概要
エラーメッセージ: "System.CalloutException: Callout loop detected"
原因: 外部APIへのコールアウトが無限ループになり、Salesforceが検知して処理を停止する。
影響: API連携の処理が中断され、データの送受信が正常に完了しない。
Salesforceのコールアウト制限
処理タイプ 制限値 1トランザクション内のコールアウト数 100回 1回のコールアウトの最大レスポンスサイズ 6MB(同期)/12MB(非同期)
2. エラーが発生する主な原因
① APIのレスポンスによって再帰的にコールアウトが発生
APIからのレスポンスを受け取った後に、トリガーやワークフローが再びAPIを呼び出す処理を実行すると、無限ループが発生。
② Salesforceのトリガーやフローが外部システムを呼び出し、その外部システムがSalesforce APIを呼び出す
例: Salesforce → APIリクエスト → 外部システム → Salesforce API → Salesforce → APIリクエスト … という無限ループ。
③ @future や Queueable を利用した非同期処理が繰り返し実行される
@future(callout=true) のメソッドが連鎖的に呼び出され、処理が無限ループ化。
④ APIリクエストの送信条件が不適切
APIの実行条件が適切に設定されておらず、常にコールアウトをトリガーするロジックになっている。
3. エラーを回避するための修正方法
① コールアウト回数を制御する
修正後のコード(コールアウト回数を制限)
public class CalloutHandler {
private static Integer calloutCount = 0;
public static void makeCallout() {
if (calloutCount >= 5) {
System.debug('Callout limit reached');
return;
}
calloutCount++;
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
}
}
改善点: calloutCount を導入し、1つの実行内でのコールアウト回数を制限。
② 外部APIのレスポンスをチェックし、不要なリクエストを防ぐ
修正後のコード(APIレスポンスを判定)
public static void makeConditionalCallout() {
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/status');
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
if (res.getBody().contains('Success')) {
System.debug('Callout successful, no need to retry.');
} else {
System.debug('Retrying callout...');
makeConditionalCallout(); // 条件に応じてリトライ
}
}
改善点: 外部APIのレスポンス内容を判定し、不要なコールアウトの再試行を防ぐ。
③ 非同期処理の使用を適切に管理する
修正後のコード(Queueable Apexでコールアウト回数を管理)
public class CalloutQueueable implements Queueable, Database.AllowsCallouts {
public void execute(QueueableContext context) {
HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
}
}
// コールアウト回数を制御
if (Limits.getCallouts() < 100) {
System.enqueueJob(new CalloutQueueable());
}
改善点: Limits.getCallouts() を利用して、コールアウト回数を超えないように制御。
4. まとめ & Udemy・会社HPの紹介
「Callout loop detected」エラーは、Salesforceが無限ループになっているコールアウト処理を検知し、実行を停止する場合に発生 します。適切なコールアウト回数制御、APIレスポンスのチェック、非同期処理の適切な管理を行うことで、エラーを回避し、システムの安定性を向上させることができます。
🔹 Salesforceの詳細を学ぶならUdemy講座がおすすめ!
📌 Salesforce初級編:フローを使いこなして自動化を極めよう
https://www.udemy.com/course/salesforceflow/?referralCode=8F97869A4A6121086B88
📌 初心者向けSalesforce管理者ガイド:魅せるレイアウトで業務効率をアップしよう!
https://www.udemy.com/course/salesforce-basics-j/?referralCode=4200CF5D86BBE3ABF2D4
🔗 HPからご相談も可能
https://effinous.com/
さらに、無料でSalesforceのチェックリストを配布しています!Udemy講座を受講する前に、ぜひ「Salesforceフローの学習ロードマップ(PDF)」をダウンロードしてください。
SalesforceのAPI連携を適切に管理し、無限ループを防ぐことで、業務の安定性と効率を向上させましょう!