Разговоры Service Broker не закрыты (остаются в состоянии CONVERSING)

Я заметил, что некоторые разговоры не закрываются, оставаясь в состоянии РАЗГОВОРА. Странно то, что очередь настроена на обработку только одного сообщения за раз. На практике, однако, есть 2 диалога в состоянии CONVERSING, один из которых действительно выполняет какую-то работу, а другой кажется зависшим.

Одна вещь, которую я использую, — это единая очередь и служба, которая отличается от обычных реализаций брокера служб (что делает ее больше похожей на монолог, а не на диалог). Я начинаю активацию 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

person noup    schedule 23.11.2010    source источник
comment
Вам будет трудно помочь, если вы не предоставите дополнительный код (я говорю не о бизнес-логике, а о компонентах, связанных с брокером), а также о командах DDL, которые вы использовали для настройки всего этого.   -  person Pawel Marciniak    schedule 24.11.2010


Ответы (3)


Используя «КОНЕЦ РАЗГОВОРА« дескриптор разговора »С ОЧИСТКОЙ;» неправильный способ закончить разговор.

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

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

person Jānis    schedule 23.01.2012

Ты можешь попробовать

END CONVERSATION 'дескриптор диалога' WITH 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 — http://msdn.microsoft.com/en-us/library/bb934450.aspx

person Siva    schedule 13.08.2011

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 обратно инициатору. Итак, теперь инициатор (в приведенном выше коде) должен проверить тип входящего сообщения и действовать соответствующим образом. Если это завернуто в хранимую процедуру, она получит ОБА фактическое ответное сообщение и сообщение END CONVERSATION, одно за другим.

person Todd C    schedule 08.07.2014