none
Как SQL Server определяет, какая служба отправила сообщение в диалог, если это не оговорено контрактом? RRS feed

  • Вопрос

  • Я сейчас знакомлюсь с компонентом Service Broker. Для ознакомления использую только BOL.

    И вот я создал скрипт, в котором создал две службы и две очереди, один тип сообщений, и один контракт, согласно которому сообщения данного типа может отправлять любая сторона диалога. Теперь я в этом же скрипте (в качестве эксперимента) начинаю диалог. Для этого я указываю, какая служба его инициирует, а какая — является целевой в этом диалоге; я также указываю контракт, по которому будет происходить диалог.

    А теперь начинается самое для меня непонятное. В ЭТОМ ЖЕ скрипте я могу выполнить команду SEND и отправить в этот диалог сообщение. Возникает вопрос: какая служба отправила его? Ясный пень, что это сообщение добавится в очередь целевой службы, потому только инициирующая служба могла отправить первое сообщение в диалоге. Выходит, этот скрипт работает от имени службы-инициатора диалога. Потом я В ЭТОМ ЖЕ скрипте принимаю сообщение из очереди целевой службы (я уже выступаю в роли целевой службы). А теперь я снова отправляю сообщение. От имени какой службы? SQL Server решает, что я сделал это от имени инициатора, и помещает сообщение в очередь целевой службы. Но чем он руководствовался, принимая такое решение?

    И вот мой вопрос: как же SQL Server определяет, от лица какой службы действует конкретный скрипт/процедура/приложение, запуская команду SEND, и, следовательно, в какую очередь поместить сообщение: инициатора или цели? В BOL ответа не нашёл :( Обращаюсь к сообществу: объясните, пожалуйста, нубу. Может, я неправильно понимаю концепцию служб? В определении сказано, что это всего лишь имя, для обозначения группы скриптов/продедур и т. д.

    15 сентября 2012 г. 20:42

Ответы

  • Ну и намучился же я с этими службами! Но вот ещё полчасика покопался и сам себе ответил:

    Когда я при отправке сообщения указываю диалог, я это делаю с помощью указания идентификатора диалога conversation_handle типа uniqueidentifier. А получить этот идентификатор можно двумя способами: либо при создании диалога, либо при получении сообщения из очереди с помощью команды RECEIVE. Это я давно читал. Так вот, оказывается, при создании диалога выдаётся один идентификатор, при получении сообщений из очереди целевой службы — другой, а при получении сообщений из очереди отправителя — первый (тот же, что и при создании диалога). То есть у одного диалога есть два разных идентификатора: идентификатор диалога со стороны инициатора и идентификатор диалога со стороны цели. В зависимости от того, какой есть у Вас, SQL Server определяет, кто Вы есть. Если у Вас есть оба, то Вы — и то, и другое (как в моём примере).





    15 сентября 2012 г. 21:19

Все ответы

  • Ну и намучился же я с этими службами! Но вот ещё полчасика покопался и сам себе ответил:

    Когда я при отправке сообщения указываю диалог, я это делаю с помощью указания идентификатора диалога conversation_handle типа uniqueidentifier. А получить этот идентификатор можно двумя способами: либо при создании диалога, либо при получении сообщения из очереди с помощью команды RECEIVE. Это я давно читал. Так вот, оказывается, при создании диалога выдаётся один идентификатор, при получении сообщений из очереди целевой службы — другой, а при получении сообщений из очереди отправителя — первый (тот же, что и при создании диалога). То есть у одного диалога есть два разных идентификатора: идентификатор диалога со стороны инициатора и идентификатор диалога со стороны цели. В зависимости от того, какой есть у Вас, SQL Server определяет, кто Вы есть. Если у Вас есть оба, то Вы — и то, и другое (как в моём примере).





    15 сентября 2012 г. 21:19
  • Спасибо, что поделились решением, оно будет полезным пользователям форума.


    Для связи [mail]

    18 сентября 2012 г. 7:29
  • Спасибо, что поделились решением, оно будет полезным пользователям форума.


    Для связи [mail]

    Ну да, я для того и писал. Я уже не раз обращался здесь на форумах за помощью. И не раз искал ответы на свои вопросы. Думаю, наверняка кому-то ещё пригодится: или через местный поиск найдёт или через поисковик типа Яндекса...
    18 сентября 2012 г. 12:28