2013-11-09 4 views
0

Скажем, у меня есть два экземпляра одного и того же приложения, взаимодействующих с бэкэнд-сервисом в Service Broker. Как каждый экземпляр знает, как обрабатывать только разговоры, которые он инициировал, и игнорировать остальные? Если я правильно помню, каждый RECEIVE удалит сообщение из очереди.Несколько разговоров на Service Broker

Вот пример:

-- Assume the SquareService return the square of the number sent to it 

-- Instance 1 
BEGIN DIALOG @Conversation1 
    FROM SERVICE InitService 
    TO SERVICE 'SquareService' 
    ON CONTRACT (MyContract) 
    WITH ENCRYPTION = OFF; 

    SEND ON CONVERSATION @Conversation1 MESSAGE TYPE MyMessageType('1'); 

-- Instance 2 
BEGIN DIALOG @Conversation2 
    ...; 
    SEND ON CONVERSATION @Conversation2 MESSAGE TYPE MyMessageType('2'); 

Теперь, кто я должен написать заявление RECEIVE так, что Instance 1 будет правильно получить 1 и 2 Instance получить 4 назад?

ответ

1

Вы уже используете группу разговора. Этого недостаточно для ваших нужд при получении сообщений? -> с помощью GET CONVERSATION GROUP и ПОЛУЧИТЬ вместе вы можете прочитать об этом здесь: http://technet.microsoft.com/en-us/library/ms166131%28v=sql.105%29.aspx , а также здесь Sql Server Service Broker Conversation Groups

+0

Благодарность и полная марку для вас ответ. Документация Microsoft настолько бедна по этой теме, что я даже не знаю, для чего предназначена «ГРУППА КОНВЕРСАЦИИ». –

0

Я предполагаю, что у вас есть InitQueue связанный с InitService. Вы можете использовать пункт WHERE с RECEIVE для прослушивания сообщений на тот же разговор:

WAITFOR (RECEIVE @response = CONVERT(xml, message_body) 
    FROM InitQueue -- InitService setup to use InitQueue? 
    WHERE conversation_handle = @Conversation1 
Смежные вопросы