見出し画像

【Apexエラー】「Callout failed due to timeout」エラーの解決策



SalesforceのApexコードで外部APIを呼び出す際に、「Callout failed due to timeout」というエラーが発生することがあります。このエラーは、APIリクエストがSalesforceの許容時間(タイムアウト時間)を超えても応答が返ってこない場合 に発生します。

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


1. エラーの概要

  • エラーメッセージ: "System.CalloutException: Callout failed due to timeout"

  • 原因: 外部APIの応答がSalesforceのタイムアウト制限を超えたため、処理が失敗

  • 影響: API連携が完了せず、データの取得や送信が正しく行われない

Salesforceのコールアウト制限

処理タイプ 制限値 同期コールアウトの最大タイムアウト 120秒 非同期コールアウトの最大タイムアウト 120秒 1トランザクション内のコールアウト回数 100回


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

① 外部APIのレスポンスが遅い

  • 外部システムの応答時間が長く、Salesforceのタイムアウト制限を超えてしまう。

② タイムアウト時間の設定が適切でない

  • HttpRequest の setTimeout() が適切に設定されていない。

③ ネットワークの遅延や障害

  • Salesforceのサーバーと外部APIサーバーの間の通信が遅延し、タイムアウトが発生することがある。

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

  • 長時間のコールアウト処理を同期処理(通常のApexコード)で実行していると、制限に達する。


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

① setTimeout() の適切な設定

修正後のコード(タイムアウトを適切に設定)

HttpRequest req = new HttpRequest();
req.setEndpoint('https://api.example.com/data');
req.setMethod('GET');
req.setTimeout(120000); // 最大120秒に設定
Http http = new Http();
HttpResponse res = http.send(req);
  • 改善点: setTimeout(120000) を設定することで、最大許容範囲までリクエスト待機可能。

② 外部APIの応答速度を最適化

  • 外部システムのAPI担当者に問い合わせ、レスポンスを早くできるよう調整。

  • APIが不要なデータを返していないか確認し、レスポンスサイズを最適化。

③ 非同期処理(@future, Queueable)を利用する

修正後のコード(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');
        req.setTimeout(120000);
        Http http = new Http();
        HttpResponse res = http.send(req);
    }
}

System.enqueueJob(new CalloutQueueable());
  • 改善点: コールアウトを Queueable Apex で非同期実行し、時間制限の影響を受けにくくする。

④ 再試行(リトライ)処理の実装

修正後のコード(リトライ処理を追加)

public class CalloutHandler {
    public static Integer retryCount = 0;
    public static void makeCallout() {
        try {
            HttpRequest req = new HttpRequest();
            req.setEndpoint('https://api.example.com/data');
            req.setMethod('GET');
            req.setTimeout(120000);
            Http http = new Http();
            HttpResponse res = http.send(req);
            System.debug(res.getBody());
        } catch (CalloutException e) {
            if (retryCount < 3) {
                retryCount++;
                System.debug('Retrying callout... Attempt: ' + retryCount);
                makeCallout();
            } else {
                System.debug('Max retry attempts reached.');
            }
        }
    }
}
  • 改善点: エラーが発生した場合に 最大3回までリトライ する処理を追加。


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

「Callout failed due to timeout」エラーは、Salesforceが外部APIのレスポンスを制限時間内に受信できなかった場合に発生 します。適切な setTimeout() 設定、非同期処理の活用、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コールアウトを適切に管理し、タイムアウトエラーを回避することで、業務の安定性と効率を向上させましょう!

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