Переговоры сервисного брокера не закрыты (пребывание в состоянии ПРЕОБРАЗОВАНИЯ) - PullRequest
2 голосов
/ 23 ноября 2010

Я замечаю, что некоторые разговоры не закрываются, а остаются в состоянии ПРЕОБРАЗОВАНИЯ. Странно то, что очередь настроена на обработку только 1 сообщения за раз. На практике, однако, есть два разговора в состоянии ПРЕОБРАЗОВАНИЯ: один действительно выполняет какую-то работу, а другой кажется застрявшим.

Одна вещь, которую я использую, - это отдельная очередь и служба, которые отличаются от обычных реализаций брокера служб (делая его больше похожим на монолог, а не на диалог). Я запускаю активацию SP с:

RECEIVE TOP(1)
    @Handle = conversation_handle,
    @MsgTypeName = message_type_name
FROM [//MyQueue]

IF (@@ROWCOUNT = 0)
    RETURN
ELSE IF ((@MsgTypeName is null) or (@Handle is null))
    RETURN
ELSE IF (@MsgTypeName != '//MyRequest')
    BEGIN
        END CONVERSATION @Handle
        RETURN
    END

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

Можете ли вы попробовать

КОНЕЦ КОНВЕРСАЦИИ 'ручка разговора' С CLEANUP;

Я работал с сервисным брокером в прошлом.Я хотел бы предоставить вам несколько ссылок для устранения неполадок, которые я использовал для ссылки на сервисный брокер

http://www.mssqltips.com/tip.asp?tip=1197 http://blogs.msdn.com/b/sqlserverfaq/archive/2011/05/03/service-broker-concepts-and-troubleshooting.aspx

ssbdiagnose Utility - http://msdn.microsoft.com/en-us/library/bb934450.aspx

0 голосов
/ 08 июля 2014
ELSE IF (@MsgTypeName != '//MyRequest')
    BEGIN
        END CONVERSATION @Handle
        RETURN
    END

Не очень хорошая идея . Попробуйте это:

IF @MsgTypeName = '//MyRequest'
BEGIN
  /* Do something here with the message */
END
ESLE IF @MsgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
BEGIN
    END CONVERSATION @Handle
END
ELSE IF @MsgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error'
BEGIN
     END CONVERSATION @Handle
    /* do some error reporting here */
END

Напомним, что ОБА Инициатору и Цели необходимо завершить разговор, прежде чем он может быть действительно завершен. И именно эта цель обычно отправляет первое сообщение END CONVERSATION обратно Инициатору. Поэтому теперь Инициатору (в приведенном выше коде) необходимо проверить тип входящего сообщения и действовать соответствующим образом. Если это завернуто в сохраненный процесс, он получит ОБА собственно ответное сообщение и сообщение КОНЕЦ КОНВЕРСАЦИИ, одно за другим.

0 голосов
/ 23 января 2012

Использование "END CONVERSATION 'обработчика разговора' WITH CLEANUP;" это не правильный способ закончить разговор.

Сервисный брокер предназначен для диалогов, а не для монологов. Это также должно быть причиной двух разговоров (один для отправки сервиса, а другой для получения сервиса - поскольку сервисы могут находиться в разных базах данных / экземплярах)

Вы можете создать службу отправки, которая будет использоваться для отправки сообщений и получения сообщений «Завершить диалог» и заканчивать диалог, а другая, которая принимает сообщения и выполняет некоторую обработку с ними + завершает диалог, когда работа завершена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...