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

ストリーミング API エラーの処理

いくつかの一般的なエラーと、ストリーミングクライアントでの処理方法について説明します。

401 認証エラー

クライアント認証は無効になることがあります。たとえば、OAuth トークンが取り消されたり、Salesforce システム管理者が Salesforce セッションを取り消したりした場合、クライアント認証が無効になります。システム管理者は、クライアントがイベントを受信することを防ぐために OAuth トークンを取り消したり Salesforce セッションを削除したりできます。クライアントは、誤って Salesforce セッションからログアウトして認証を無効にしてしまうことがあります。ストリーミング API は、クライアントが接続されている間は定期的に OAuth トークンまたはセッション ID を検証します。クライアント認証が無効な場合、クライアントにエラーが通知されます。401::Authentication invalid のエラー値と reconnect=noneadvice 項目を含む Bayeux メッセージが /meta/connect チャネルで送信されます。チャネルリスナーでエラー通知を受信したクライアントが新規イベントを受信するには、再認証と再接続が必要です。

OAuth またはセッショントークンが要求ヘッダーで送信されない場合、401 エラーメッセージのテキストは 401::Request requires authentication となります。

メモ

/meta/connect チャネルで送信されるエラー応答メッセージは次のようになります。

1{
2  "clientId": "1q1ib66fvm7kli1gfoauu95i78g", 
3  "advice": {
4    "reconnect": "none", 
5    "interval": 0
6  }, 
7  "channel": "/meta/connect", 
8  "id": 7, 
9  "error": "401::Authentication invalid", 
10  "successful": false
11}

接続の失敗が原因で、クライアントが新しいハンドシェイク要求を実行する必要がある場合、認証エラーが /meta/handshake チャネルで送信されます。ハンドシェイク要求は、応答内の 403::Handshake denied エラーで失敗します。401::Authentication invalid エラーは応答内の ext プロパティでネストされます。

/meta/handshake チャネルで送信されるエラー応答メッセージは次のようになります。

1{ 
2  "ext": { 
3    "sfdc": { 
4      "failureReason": "401::Authentication invalid" 
5    } 
6  }, 
7  "advice": { 
8    "reconnect": "none" 
9  }, 
10  "channel": "/meta/handshake", 
11  "error": "403::Handshake denied", 
12  "successful": false 
13}

再認証のコード例については、EMPConnector GitHub プロジェクトの AuthFailureListener クラスを参照してください。

無効なクライアント認証には Salesforce セッションの有効期限が含まれません。CometD クライアントでは、Salesforce セッションが期限切れになることはありません。クライアントが接続されている限り、Salesforce はタイムアウト期間を延長し続けます。

メモ

403 不明なクライアントエラー

長命 (long-lived) 接続が予期しないネットワークの中断により失われた場合、CometD サーバはクライアントをタイムアウトにし、クライアントの状態を削除します。CometD クライアントは再接続を試みますが、クライアントの状態が存在しないため 403::Unknown client エラーで拒否されます。タイムアウト後にクライアントが再接続を試みたときに返されるエラー応答メッセージは次のようになります。

1{
2  "error":"403::Unknown client",
3  "successful":false,
4  "advice":{"interval":0,"reconnect":"handshake"}
5}

クライアントが 403::Unknown client エラーを受信し、エラーに "reconnect":"handshake" advice 項目が含まれている場合は、クライアントは新しいハンドシェイクを実行する必要があります。ハンドシェイクが成功すると、クライアントはハンドシェイクリスナーでチャネルに再登録する必要があります。

詳細は、「クライアントとタイムアウト」を参照してください。

403::Unknown client エラーは、複数の CometD 接続を使用しているときに返されることがあります。1 つのブラウザで使用できる CometD 接続は 1 つのみです。複数のクライアントがあるために接続が複数ある場合や、別のアプリケーションが 1 つの CometD 接続を使用している場合は、クライアントの接続は失敗します。この場合、他のクライアントを無効にするか、クライアント間で CometD を共有します。

メモ

403 ハンドシェイク要求のリソース制限および検証エラー

クライアントがハンドシェイク要求を送信すると、ストリーミング API は、クライアントが正常に接続を実行できることを確認するために、API バージョンとリソース制限をチェックします。次の検証が実行されます。

  • API バージョン
  • ストリーミングチャネル全体での同時クライアント (登録者) の最大数
  • Salesforce アプリケーションサーバでの同時接続数制限。この制限は、サービス拒否攻撃から保護するためのものです。

クライアント��検証が失敗すると、応答の error 項目に 403::Handshake denied が含まれ、エラーの原因は、ネストされた ext/sfdc/failureReason 項目で返されます。たとえば、同時接続数を超えた場合は次の応答メッセージが返されます。

1{
2  "channel" : "/meta/handshake",
3  "id" : "1",
4  "error" : "403::Handshake denied",
5  "successful" : false,
6  "advice" : {
7    "reconnect" : "none"
8  },
9  "ext" : {
10    "sfdc" : {
11      "failureReason" : "403::To protect all customers from excessive use and Denial of
12         Service attacks, we limit the number of simultaneous connections per server.  
13         Your request has been denied because this limit has been exceeded.  
14         Please try your request again later."
15    },
16    "replay" : true,
17    "payload.format" : true
18  }
19}

1 日あたりのイベント使用の最大数は、クライアントの登録時にチェックされます。

メモ

503 サーバの混雑エラー

Salesforce サーバにストリーミング API 要求を処理するために使用可能なリソースがない場合は、ext/sfdc/failureReason 項目で 503 エラーが返されます。このエラーは、ハンドシェイクまたは接続要求に対して返されます。たとえば、次の応答は、/meta/connect チャネルでの 503 エラーを示しています。

1{
2  "channel" : "/meta/connect",
3  "id" : "6",
4  "error" : "401::Authentication invalid",
5  "successful" : false,
6  "ext" : {
7    "sfdc" : {
8      "failureReason" : "503::Server is too busy.  Please try your request again later."
9    }
10  },
11  "clientId" : "b1unwa43ckd43m16v60gs6v2yv7",
12  "advice" : {
13    "reconnect" : "none",
14    "interval" : 0
15  }
16}

503 エラーを受信した場合、数分待ってからもう一度要求を実行してください。このエラーは一時的なもので、Salesforce アプリケーションサーバが再び使用可能になると、要求は成功します。