ルーティングおよびメッセージ配信のトラブルシューティング

ここでは、ルーティングおよびメッセージ配信に関連する一般的な問題の修正方法を示します。

テクニック : メッセージ配信を診断する

2 つのサービス間のメッセージ配信に失敗した場合は、ssbdiagnose ユーティリティを使用して、メッセージ交換のランタイム レポートを生成します。ランタイム レポートには、メッセージ交換の操作によって発生したすべてのエラーが表示されます。エラーが発生した場合、ssbdiagnose によって、サービス間の構成も分析され、検出される構成上の問題が報告されます。詳細については、「ssbdiagnose ユーティリティ」を参照してください。

問題 : メッセージが転送キューに残る

Service Broker のメッセージ配信がデータベースでアクティブ化されていることを確認します。次のサンプルに示すように、sys.databasesis_broker_enabled 列には、Service Broker のメッセージ配信がアクティブ化されているかどうかが示されます。

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 は、まだメッセージの送信を試行していません。enqueue_time 列で、メッセージが長期間キューに残っていることが示されている場合は、Service Broker のメッセージ配信がデータベースでアクティブ化されていない可能性があります。

問題 : ルートが存在しているにもかかわらず、サービスのルートが存在しないという転送エラーが表示される

この問題の最も一般的な原因を次に示します。

  • 正常にメッセージ配信を行うルートが存在しない場合に SEND ステートメントでメッセージを作成しました。

  • ルートが後から作成されたにもかかわらず、Service Broker がまだメッセージの再送信を試行していません。

再試行の詳細については、「Service Broker のルーティングとネットワーク」を参照してください。

メッセージで指定されているサービス名が、ルートで指定されているサービス名と正確に一致していることを確認します。Service Broker では、サービス名の照合に、バイト単位のバイナリ比較を使用します。そのサービス名を指定したルートが存在する場合、次のクエリを実行して名前を比較できます。

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) ;
注意

サービス名によっては、ルートと一致する場合でも、結果セットに表示されることがあります。サービス名を指定していないルート (remote_service_name = NULL) は、任意のメッセージで使用されているサービス名と一致します。

Service Broker ルートの詳細については、「Service Broker のルーティング」を参照してください。

メッセージでブローカ インスタンス識別子が指定されている場合は、ルートで同じブローカ インスタンス識別子が指定されていること、またはルートでブローカ インスタンス識別子が指定されていないことを確認してください。

ルートの有効期限が切れていないことを確認してください。sys.routes カタログ ビューの有効期間列に、ルートの有効期限の日時が含まれています。

問題 : 対象の Service Broker にアクセスできないという転送エラーが表示される

転送先がメッセージを受け入れませんでした。これは、指定されているサービス名が、転送先の SQL Server インスタンスがホストしているサービス名に一致しないことを示している可能性があります。また、転送先にサービスのルートが含まれていないことを示している可能性もあります。この問題をトラブルシューティングするには、転送先のルーティングおよびサービスの構成を確認してください。

問題 : トランスポート層を使用できないという転送エラーが表示される

Service Broker エンドポイントが存在することを確認します。エンドポイントが存在しない場合は作成します。エンドポイントが存在する場合は、エンドポイントの状態が STARTED であることを確認します。詳細については、「Service Broker エンドポイント」を参照してください。エンドポイントの作成方法の詳細については、「Service Broker ネットワークをアクティブ化する方法 (Transact-SQL)」を参照してください。

問題 : 転送エラー "既存の接続はリモート ホストに強制的に切断されました。" が表示される

トランスポート セキュリティが正しく構成されていないか、またはルートの TCP/IP アドレスで指定されているポートが Service Broker 以外のサービスによって使用されている可能性があります。

注意

ルートで指定されているポートは、データベース エンジンのリモート インスタンスの Service Broker エンドポイントで使用されるポートと一致する必要があります。Service Broker では、メッセージの転送に Service Broker 通信プロトコルが使用され、Transact-SQL バッチおよび結果の転送に使用される表形式のデータ ストリーム プロトコルは使用されません。したがって、Service Broker エンドポイントで使用されるポートは、Transact-SQL の転送に使用されるポートとは異なります。

Service Broker エンドポイントの構成を調べて、2 つのインスタンスのネットワーク セキュリティ設定に互換性があることを確認してください。一方のインスタンスの Service Broker エンドポイントで REQUIRED または ENABLED が指定されている場合、もう一方のインスタンスの Service Broker エンドポイントに NONE を指定することはできません。

Service Broker トランスポート セキュリティの証明書、ユーザー、および権限を確認してください。詳細については、「Service Broker トランスポート セキュリティ」を参照してください。