見出し画像

【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連携を適切に管理し、無限ループを防ぐことで、業務の安定性と効率を向上させましょう!

いいなと思ったら応援しよう!