4

単純なサービスブローカーの実装を構成しています。ローカルでは、SQL Server 2008 Expressを使用しており、すべてが正常に機能します。コードが運用サーバー(SQL SERVER 2005)で実行されると、メッセージはレシーバーキューに留まります。followindコードは不完全ですが、キューとサービスが基本的にどのように構成されているかを示しています。

-- Create message type to validate the content of a message
CREATE MESSAGE TYPE MyMessageType VALIDATION = NONE;

-- Create contract to validate what direction messages can be sent in a conversation.
CREATE CONTRACT MyContract 
(
    MyMessageType SENT BY INITIATOR
) 

-- The receiver queue will process each message using the 'spProcessMessage' stored procedure
CREATE QUEUE [MyReceiverQueue];
ALTER QUEUE [MyReceiverQueue] WITH ACTIVATION 
(
      STATUS = ON,
      MAX_QUEUE_READERS = 1,
      PROCEDURE_NAME = spProcessMessage,
      EXECUTE AS SELF
);

-- The receiver service processes the incoming messages and passes them to the ReceiverQueue.
CREATE SERVICE [MyReceiverService] ON QUEUE [MyReceiverQueue]([MyContract]);

-- Queue and service to send the message from
CREATE QUEUE [MySenderQueue];
CREATE SERVICE [MySenderService] ON QUEUE [MySenderQueue];

サービスがインストールされると、次のようにメッセージが送信されます。

-- Send a message to the receiver queue
DECLARE @MessageBody XML
SET @MessageBody = ''; 
DECLARE @Handle UNIQUEIDENTIFIER;
BEGIN DIALOG CONVERSATION @Handle
FROM SERVICE [MySenderService]
TO SERVICE 'MyReceiverQueue'
ON CONTRACT [MyContract]
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @Handle 
MESSAGE TYPE [MyMessageType](@MessageBody);

すべてのメッセージは「MyReceiverQueue」でスタックします。'spProcessMessage'を手動で実行すると、メッセージは正常に処理されます。

さらにいくつかの詳細:
-sys.transmission_queueが空です -sys.conversation_endpoints、両方のサービスが「CONVERSING」であると述べています -ブローカーが有効であり、DBがSQL2005互換として構成されています


これらのメッセージが自動的に処理されない理由はありますか?

お時間をいただき、誠にありがとうございます。

-

OK、少し遊んだ後、ssbdiagnoseが機能するようになりました。Remusがコメントしたように、これはC:\ Program Files \ Microsoft SQL Server \ 100 \ Tools\Binnにあります。私はそれをこのようにローカルで動作させました:

ssbdiagnose -E -S "JDECUPER\SQLEXPRESS" -d mydb CONFIGURATION FROM SERVICE MySenderService TO SERVICE MyReceiverService ON CONTRACT MyContract

次に、本番サーバーで試してみました。

ssbdiagnose -XML -U loginID -P pwd -S "machine's IP" -d mydb CONFIGURATION FROM SERVICE MySenderService TO SERVICE MyReceiverService ON CONTRACT MyContract > C:\testBrokerService.xml

最初に検出されたエラー:

Service Broker GUID is identical to that of database Pandilla on server 200.57.141.193

サーバー上の別のデータベースには、サービスブローカー用の同一のGUIDがありました。GUIDを再生成するだけで済みました。

ALTER DATABASE [myotherdb] SET NEW_BROKER;

2番目のエラーは、ストアドプロシージャを実行するためのユーザーのアクセス許可に関係していました。

The EXECUTE AS for the user dbo specified for activation on queue dbo.AlbumGanadoresQueue cannot be impersonated due to an exception

これらの権限をアップグレードした後、すべてが正しく機能し始めました。

正しい方向を示してくれたRemusに感謝します。私は少し長かったですが、詳細が他の開発者に役立つことを願っています。

4

1 に答える 1

8

まず、私のサイトのトラブルシューティングダイアログガイドを読み、考えられる問題が見つかるまでステップバイステップで実行します。
次に、SQL 2008デプロイメントにアクセスできる場合は、そこからssbdiagnoseツールを実行します。SQL 2008の一部ですが、SQL2005も完全に診断できます。これも、SQL2k8デプロイメントにアクセスできる場合に推奨される方法です。

于 2009-07-14T19:21:20.253 に答える