
【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コールアウトを適切に管理し、タイムアウトエラーを回避することで、業務の安定性と効率を向上させましょう!