見出し画像

【Apexエラー】「Too many callouts: 101」エラーの発生原因と対処法



SalesforceのApexコードで外部APIを呼び出す際に、「Too many callouts: 101」というエラーが発生することがあります。このエラーは、1つのトランザクション内でAPIコールアウト(外部HTTPリクエスト)の回数がSalesforceの制限である101回を超えた場合 に発生します。

本記事では、このエラーの原因と、適切な回避策について詳しく解説します。


1. エラーの概要

  • エラーメッセージ: "System.CalloutException: Too many callouts: 101"

  • 原因: 1つのトランザクションで 101回以上のコールアウトを実行 した

  • 影響: 外部APIとの連携処理が失敗し、データの送受信が正常に完了しない

Salesforceのコールアウト制限

処理タイプ 制限値 1トランザクション内の最大コールアウト数 100回 1回のコールアウトの最大レスポンスサイズ 6MB(同期)/12MB(非同期)


2. エラーが発生する主な原因

① ループ内でAPIコールアウトを実行している

  • for ループ内で HttpRequest を繰り返し呼び出すと、すぐに制限(100回)に達してしまう。

NG例(ループ内でコールアウトを実行)

trigger AccountTrigger on Account (after insert) {
    for (Account acc : Trigger.new) {
        HttpRequest req = new HttpRequest();
        req.setEndpoint('https://api.example.com/data');
        req.setMethod('GET');
        Http http = new Http();
        HttpResponse res = http.send(req); // 100件のレコードがあると100回コールアウトを実行 → エラー
    }
}

② 非同期処理を適切に使用していない

  • @future や Queueable を使用せず、同期処理で一度に大量のコールアウトを実行しようとすると制限に達する。

③ APIコールアウトのレスポンス遅延による制限超過

  • 外部APIのレスポンス速度が遅く、トランザクションが完了しないことでリトライが繰り返される。


3. エラーを回避するための修正方法

① ループの外でAPIコールアウトを一括実行する

修正後のコード(リストを利用してコールアウトをまとめる)

public class AccountCalloutHandler {
    public static void makeBatchCallout(List<Account> accounts) {
        Http http = new Http();
        for (Account acc : accounts) {
            HttpRequest req = new HttpRequest();
            req.setEndpoint('https://api.example.com/data');
            req.setMethod('GET');
            HttpResponse res = http.send(req);
        }
    }
}
  • 改善点: コールアウトをループの外で一括処理する。

② Queueable Apex を利用する(推奨)

  • @future ではなく Queueable Apex を使用することで、より柔軟に非同期処理を管理できる。

修正後のコード(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);
    }
}

System.enqueueJob(new CalloutQueueable());
  • 改善点: コールアウトを Queueable Apex で非同期実行し、トランザクションを分割する。

③ @future メソッドを利用する

修正後のコード(@futureメソッドで非同期処理)

public class CalloutFuture {
    @future(callout=true)
    public static void sendCallout(String endpoint) {
        HttpRequest req = new HttpRequest();
        req.setEndpoint(endpoint);
        req.setMethod('GET');
        Http http = new Http();
        HttpResponse res = http.send(req);
    }
}

trigger AccountTrigger on Account (after insert) {
    for (Account acc : Trigger.new) {
        CalloutFuture.sendCallout('https://api.example.com/data');
    }
}
  • @future メソッドを利用することで、同期処理ではなく 非同期処理 によってコールアウトを実行できる。


4. まとめ & Udemy・会社HPの紹介

「Too many callouts: 101」エラーは、1トランザクション内で許容される外部APIコールアウトの回数が制限(100回)を超えた場合に発生 します。ループ内でのコールアウトを回避し、Queueable Apex@future メソッド を活用することで、エラーを回避し、システムの安定性を向上させることができます。

🔹 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コールアウトを適切に管理し、ガバナ制限を回避することで、業務の安定性と効率を向上させましょう!

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