この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

コールアウトの制限事項

Apex コードで、HTTP 要求または Web サービスコールに対するコールアウトを実行する場合に次の制限が適用されます。Web サービスコールには、SOAP API コールまたは外部の Web サービスコールを使用できます。

  • 1 つの Apex トランザクションで、HTTP 要求または API コールに対するコールアウトを最大 100 回実行できます。
  • Developer Edition 組織の場合、Salesforce 組織のドメインの外部にあるエンドポイントに対して実行できる同時コールアウトは、最大でも 20 件までです。この制限は Developer 以外の Edition の組織には適用されません。
  • デフォルトのタイムアウトは 10 秒です。カスタムタイムアウトはコールアウトごとに定義できます。最小値は 1 ミリ秒、最大値は 120,000 ミリ秒です。Web サービスまたは HTTP コールアウトのカスタムタイムアウトの設定方法については、次のセクションの例を参照してください。
  • 1 つの Apex トランザクションによる各コールアウトのタイムアウトの累積値は、最大 120 秒です。累積値とは、特定の Apex トランザクションによって呼び出されたすべてのコールアウトのタイムアウトを合計した値です。
  • すべての組織には、実行時間 (合計実行時間) が 5 秒を超える長時間要求に対する制限があります。この制限を計算する場合、HTTP コールアウトの処理時間は含まれません。コールアウトのタイマーは一時停止され、コールアウトの完了時に再開されます。Lightning プラットフォーム Apex の制限については、「実行ガバナと制限」を参照してください。
  • 同じトランザクション内に待機中の操作が存在する場合はコールアウトを実行できません。操作が待機中となるものには、DML ステートメント、非同期 Apex (future メソッドや Apex 一括処理ジョブなど)、スケジュール済み Apex、メールの送信があります。このような操作を行う前に、コールアウトを実行するようにします。
  • 同じトランザクション内で疑似コールアウトより前に待機中の操作が発生する可能性があります。WSDL ベースのコールアウトに関する「DML 操作と擬似コールアウトの実行」または HTTP コールアウトに関する「DML 操作と擬似コールアウトの実行」を参照してください。
  • ヘッダー Expect: 100-Continue がコールアウト要求に追加されており、HTTP/1.1 100 Continue 応答が外部サーバーから返されない場合は、タイムアウトが発生します。

参照のみモードの Apex コールアウト

参照のみモード中、外部サービスへの Apex コールアウトは実行され、システムによってブロックされることはありません。通常は、コールアウトから応答を受信後、同じトランザクションでフォローアップ操作を実行します。たとえば、DML コールを実行して Salesforce レコードを更新します。ただし、参照のみモードでは、レコードの更新など Salesforce での書き込み操作がブロックされます。この参照のみモードの動作の矛盾によって、プログラムフローが壊れたり、問題が発生したりする場合があります。不正なプログラム動作を避けるために、参照のみモードでのコールアウトを防止することをお勧めします。組織が参照のみモードであるかどうかを確認するために、System.getApplicationReadWriteMode() をコールします。

次の例では、System.getApplicationReadWriteMode() の戻り値を確認します。戻り値が ApplicationReadWriteMode.READ_ONLY 列挙値と等しい場合、組織は参照のみモードで、コールアウトがスキップされます。それ以外の場合 (ApplicationReadWriteMode.DEFAULT 値) は、コールアウトが実行されます。

このクラスでは、例として Apex HTTP クラスを使用してコールアウトを実行します。WSDL2Apex からインポートした WSDL を使用してコールアウトを実行することもできます。参照のみモードを確認するプロセスは、どちらの場合でも同じです。

メモ

1public class HttpCalloutSampleReadOnly {
2    public class MyReadOnlyException extends Exception {}
3
4    // Pass in the endpoint to be used using the string url
5    public String getCalloutResponseContents(String url) {
6        
7        // Get Read-only mode status
8        ApplicationReadWriteMode mode = System.getApplicationReadWriteMode();
9        String returnValue = '';
10        
11        if (mode == ApplicationReadWriteMode.READ_ONLY) {
12            // Prevent the callout
13            throw new MyReadOnlyException('Read-only mode. Skipping callouts!');
14        } else if (mode == ApplicationReadWriteMode.DEFAULT) {
15            // Instantiate a new http object
16            Http h = new Http();
17            
18            // Instantiate a new HTTP request, specify the method (GET) 
19            // as well as the endpoint.
20            HttpRequest req = new HttpRequest();
21            req.setEndpoint(url);
22            req.setMethod('GET');
23            
24            // Send the request, and return a response
25            HttpResponse res = h.send(req);
26            returnValue = res.getBody();                        
27        }
28        return returnValue;
29    }
30}

Salesforce 組織は、計画的なサイト切り替えやインスタンス更新など、Salesforce の保守活動中に参照のみモードになります。継続的サイト切り替えの一環として、Salesforce 組織はほぼ 6 か月おきに準備サイトに切り替えられます。サイト切り替えについての詳細は、「継続的サイト切り替え」を参照してください。

Sandbox で参照のみモードをテストするには、Salesforce に連絡して参照のみモードのテストオプションを有効化してください。テストオプションが有効化されたら、参照のみモードをオンに切り替えてアプリケーションを検証できます。

コールアウトタイムアウトの設定

次の例では、Web サービスコールアウトのカスタムタイムアウトを設定します。この例では、サンプルの WSDL ファイルと生成された DocSamplePort クラス (「生成される WSDL2Apex コード」を参照) を使用します。スタブの timeout_x 変数に値を割り当てることにより、ミリ秒単位でタイムアウト値を設定します。
1docSample.DocSamplePort stub = new docSample.DocSamplePort();
2stub.timeout_x = 2000; // timeout in milliseconds

次に、HTTP コールアウトのカスタムタイムアウトの設定の例を示します。

1HttpRequest req = new HttpRequest();
2req.setTimeout(2000); // timeout in milliseconds