2016-08-10 3 views
0

Я пытаюсь перевести разговор сервис-брокера в другой групповой разговор. Код:Ошибка перевода разговоров

declare @handle uniqueidentifier; 
    declare @conversationGroup uniqueidentifier; 

    begin dialog conversation @handle 
     from service ConsolidatorService 
     to service 'ConsolidatorTargetService' 
     on contract [//Gereon/Consolidator/ConsolidatorContract] 
     with encryption = off; 


    get conversation group @conversationGroup from [ConsolidatorTargetQueue]; 
    if(@conversationGroup is not null) 
     move conversation @handle to @conversationGroup; 

    send on conversation @handle message type [//Gereon/Consolidator/GeBasicChangesMessage] 
    (@MessageBody); 

Но SQL Server возвращает мне ошибку назначения разговор группы '60EEBC15-E75E-E611-80CC-00155D090304' недействителен.

Я не могу понять, почему group_conversation_id возвращен путем получения разговора недействителен.

Спасибо

ответ

0

Вы пытаетесь переместить инициатора ручку к группе на целевой службы. Перемещение разговоров может быть выполнено только в пределах одной службы и очереди.

Ваш вопрос является общей проблемой с попыткой добиться группировки разговоров на принимающей стороне. Для достижения желаемого результата есть два варианта:

  • Вы можете перевести разговор на цель после получения первого сообщения. Это означает, что у вас есть способ отличить первое сообщение от последующих, разговор не будет сгруппирован для первого полученного сообщения и будет склонен к взаимоблокировкам из-за блокировки группы разговоров между параллельными приемниками. Из-за этих проблем я не рекомендую этот шаблон.
  • вы можете обратный направление диалога. Вместо того, чтобы начать разговор с до ConsolidatorTargetService, запустите диалог от ConsolidatorTargetService до ConsolidatorServiceи укажите нужную группу в самой BEGIN CONVERSATION. Затем отправьте сообщение от цели к инициатору. ПОЛУЧИТЕ это сообщение инициатору, а затем используйте этот обработанный инициатор для последующих отправлений от ConsolidatorService. Это имеет смысл только в том случае, если вы намерены отправлять много сообщений. Этот шаблон работает, но немного сложно реализовать правильно.

Теперь $ 1M вопрос: почему вы хотите сгруппировать разговоры на цель? Для этого есть правильное использование, но я хотел бы услышать ваши рассуждения.

+0

Что я пытаюсь сделать, так это создать триггер, который отправляет сообщения в очередь, а с другой стороны получает их хранимая процедура. Но я хочу, чтобы сообщения были скоррелированы в той же группе talk_group. Не важно порядок сообщений, но разговор важен, потому что sp должен получать все сообщения, коррелированные с той же корреляцией_group_id (sp получает только 1 msg за раз). Я пробовал это [ссылка] (http://stackoverflow.com/questions/38878407/ms-sql-server-2012-service-broker-begin-conversation-error?noredirect1_comment65142517_38878407), но без успеха – zappasan

+0

Обратное направление должно отлично работать для вас. –

+0

Хорошо, я уже пытался написать начальное диалоговое окно таким образом «от ConsolidatorTarget до ConsolidatorTargetService», и он работает. Но это звучит немного странно, написав диалог начала для инициатора таким образом, потому что служба инициатора не является целью. – zappasan

Смежные вопросы