ストリーミング API エラーの処理
401 認証エラー
クライアント認証は無効になることがあります。たとえば、OAuth トークンが取り消されたり、Salesforce システム管理者が Salesforce セッションを取り消したりした場合、クライアント認証が無効になります。システム管理者は、クライアントがイベントを受信することを防ぐために OAuth トークンを取り消したり Salesforce セッションを削除したりできます。クライアントは、誤って Salesforce セッションからログアウトして認証を無効にしてしまうことがあります。ストリーミング API は、クライアントが接続されている間は定期的に OAuth トークンまたはセッション ID を検証します。クライアント認証が無効な場合、クライアントにエラーが通知されます。401::Authentication invalid のエラー値と reconnect=none の advice 項目を含む Bayeux メッセージが /meta/connect チャネルで送信されます。チャネルリスナーでエラー通知を受信したクライアントが新規イベントを受信するには、再認証と再接続が必要です。
/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 クラスを参照してください。
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 ハンドシェイク要求のリソース制限および検証エラー
クライアントがハンドシェイク要求を送信すると、ストリーミング 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}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 アプリケーションサーバーが再び使用可能になると、要求は成功します。