Компонент Service Broker с Sql Server 2005 - сообщения застряли в очереди - PullRequest
4 голосов
/ 14 июля 2009

Я настраиваю простую реализацию брокера сервисов. Локально мы используем SQL Server 2008 Express, и все работает отлично. Когда код запускается на нашем производственном сервере (SQL SERVER 2005), сообщения помещаются в очередь получателя. Следующий код неполон, но указывает, как в основном настраиваются очереди и службы:

-- 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 заявить, что оба сервиса «конвертируют»
- Брокер включен, а БД настроена как совместимая с SQL 2005

Есть идеи, почему эти сообщения не обрабатываются автоматически?

Большое спасибо за ваше время.

-

ОК, немного поиграв, я получил ssbdiagnose , работающий. Как отметил Ремус, он находится здесь: 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;

Вторая ошибка была связана с правами пользователя на выполнение хранимой процедуры :

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

После обновления этих разрешений все стало работать правильно.

Большое спасибо Ремусу за указание в правильном направлении. Я был немного долго, но я надеюсь, что детали помогут другим разработчикам.

1 Ответ

8 голосов
/ 14 июля 2009

Прежде всего прочитайте руководство Устранение неполадок на моем сайте и следуйте пошаговым инструкциям, пока не найдете возможную проблему.
Во-вторых, , если у есть доступ к развертыванию SQL 2008, запустите из него инструмент ssbdiagnose . Хотя он является частью SQL 2008, он вполне способен диагностировать и SQL 2005. Это предпочтительный метод, опять же, , если у вас есть доступ к развертыванию SQL 2k8.

...