ルーティングおよびメッセージ配信のトラブルシューティング
ここでは、ルーティングおよびメッセージ配信に関連して発生する一般的な現象の修正方法について提案を示します。
現象 : メッセージが転送キューに残ったままになる
Service Broker のメッセージ配信がデータベースでアクティブ化されていることを確認します。ブローカのメッセージ配信がアクティブ化されているかどうかは、sys.databases の is_broker_enabled 列に表示されます (次のサンプルを参照)。
SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;
メッセージが間違ったデータベースに配信されることを防ぐため、ブローカのメッセージ配信を非アクティブ化することができます。Service Broker のメッセージ配信の詳細については、「Service Broker の ID の管理」を参照してください。Service Broker のメッセージ配信のアクティブ化の詳細については、「データベースで Service Broker のメッセージ配信をアクティブ化する方法 (Transact-SQL)」を参照してください。
Service Broker のメッセージ配信がアクティブな場合は、メッセージの sys.transmission_queue カタログ ビューの transmission_status 列を確認してください。一般的なエラー メッセージには、次のものがあります。
メッセージ | 説明 |
---|---|
このメッセージ交換の対象となるサービス名に一致するルートがありません。このメッセージ交換でのメッセージの対象となるサービス名へのルートを作成してください。 |
Service Broker は、指定されたサービスへのルートを見つけることができませんでした。 |
対象の Service Broker にアクセスできません。 |
Service Broker は、メッセージを対象の Service Broker に配信できませんでした。 |
トランスポート層を使用できません。 |
インスタンス内に Service Broker エンドポイントが存在しないか、または Service Broker エンドポイントが正常に起動していません。 |
対象のキューが無効です。 |
転送先サービスが使用しているキューの STATUS オプションが OFF に設定されています。Service Broker は、STATUS が OFF のキューには新しいメッセージを追加しません。 |
データ '10054 (既存の接続はリモート ホストに強制的に切断されました。)' を受信中にエラーが発生しました。 |
メッセージ交換のリモート側が、TCP/IP 接続を受け入れましたが、メッセージの送信を許可する前に接続を閉じました。 |
(なし) |
Service Broker は、まだメッセージの送信を試行していません。これは、データベースで Service Broker のメッセージ配信がアクティブ化されていないことを示している可能性があります。 |
現象 : ルートが存在しているにもかかわらず、転送エラー "このメッセージ交換の対象となるサービス名に一致するルートがありません。このメッセージ交換でのメッセージの対象となるサービス名へのルートを作成してください" が表示される
メッセージが表示された後でルートを作成した場合には、ルートを作成した後でメッセージが再試行されていないことが、この現象の最も一般的な原因です。再試行の詳細については、「Service Broker のルーティングとネットワーク」を参照してください。
メッセージで指定されているサービス名が、ルートで指定されているサービス名と正確に一致しているかどうかを確認します。Service Broker では、サービス名の照合に、バイト単位のバイナリ比較を使用します。そのサービス名を指定したルートが存在する場合、この比較をチェックするための 1 つの方法として、次のようなクエリを実行します。
SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
(SELECT remote_service_name
FROM sys.routes AS routes
WHERE tq.to_service_name = routes.remote_service_name) ;
結果セットに表示されたサービス名には、それと正確に一致するサービス名がデータベースのルーティング テーブルに含まれていません。サービス名が指定されていないルートは、すべてのサービス名に一致することに注意してください。ルーティングの詳細については、「Service Broker のルーティング」を参照してください。
メッセージでブローカ インスタンス識別子が指定されている場合は、ルートで同じブローカ インスタンス識別子が指定されていること、またはルートでブローカ インスタンス識別子が何も指定されていないことを確認してください。
ルートの有効期限が切れていないことを確認してください。sys.routes カタログ ビューの有効期間列に、ルートの有効期限の日時が含まれています。
現象 : 転送エラー "対象の Service Broker にアクセスできません" が表示される
転送先がメッセージを受け入れませんでした。これは、指定されているサービス名が、転送先 SQL Server インスタンスがホストしているサービス名に一致しないか、または転送先がサービスのルートを格納していないことを示している可能性があります。この問題をトラブルシューティングするには、転送先のルーティングおよびサービスの構成を確認してください。
現象 : 転送エラー "トランスポート層を使用できません" が表示される
Service Broker エンドポイントが存在しているかどうか、およびエンドポイントの状態が STARTED かどうかを確認します。そのようになっていない場合は、エンドポイントを作成してください。Service Broker エンドポイントの詳細については、「Service Broker エンドポイント」を参照してください。エンドポイントの作成方法の詳細については、「Service Broker ネットワークをアクティブ化する方法 (Transact-SQL)」を参照してください。
現象 : 転送エラー "既存の接続はリモート ホストに強制的に切断されました。" が表示される
トランスポート セキュリティの構成に誤りがあるか、またはルートの TCP/IP アドレスで指定されているポートが、Service Broker 以外のサービスによって使用されている可能性があります。Service Broker では、表形式のデータ ストリーム プロトコルを使用しないことに注意してください。ルートで指定するポートは、リモートの SQL Server インスタンスの Service Broker エンドポイントで使用されるポートと一致している必要があります。
Service Broker エンドポイントの構成を調べて、2 つのインスタンスのネットワーク セキュリティ設定に互換性があることを確認してください。一方のインスタンスの Service Broker エンドポイントで REQUIRED または ENABLED が指定されている場合、もう一方のインスタンスの Service Broker エンドポイントに NONE を指定することはできません。
Service Broker トランスポート セキュリティの証明書、ユーザー、および権限を確認してください。トランスポート セキュリティの構成については、トピック「Service Broker トランスポート セキュリティ」を参照してください。
参照
処理手順
Service Broker ネットワークをアクティブ化する方法 (Transact-SQL)
概念
Service Broker のルーティングとネットワーク
Service Broker エンドポイント
Service Broker のルーティング
キューの開始と停止
その他の技術情報
sys.databases (Transact-SQL)
sys.transmission_queue (Transact-SQL)
sys.routes (Transact-SQL)
sys.service_broker_endpoints (Transact-SQL)