Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
Добрый день.

Выполняю след. скрипт:
CREATE CONTRACT [TestContract] ([TestType] SENT BY INITIATOR)
...
...
CREATE SERVICE [DestService2] ON QUEUE [_FD_QUEUE] ([TestContract])
...
...

DECLARE @convHandler uniqueidentifier

-- начало диалога
--
BEGIN DIALOG   @convHandler
    FROM SERVICE    [SourceService]
    TO SERVICE      'DestService2'
    ON CONTRACT     [TestContract];

-- посылка сообщения
--
SEND ON CONVERSATION  @convHandler 
   MESSAGE TYPE [TestType] (N'Message!!!')

-- завершение диалога
--
--
END CONVERSATION  @convHandler


Как видно, я открываю диалог, и тут же его закрываю. Всё супер, сообщение из одной очереди прибывает в другую, но
есть таблица открытых диалогов:
select * from sys.conversation_endpoints

В которой регистрируется 2 диалога... почему 2 непонятно!
Один из диалогов закрывается, если вызывать "END CONVERSATION @convHandler", второй активен.

Вопросы:
1. Откуда берётся второй диалог? Кто его создаёт? И почему странный статус: state_desc = DISCONNECTED_INBOUND?
conversation_handle			conversation_id			is_initiator	service_contract_id				service_id	lifetime	state	state_desc		far_service
980B5BFE-EA4D-E411-83BC-00155D194E04	7CBA829F-2420-472C-9410-F7970F76D7F6	0	65537	970B5BFE-EA4D-E411-83BC-00155D194E04	65546	2082-10-25 09:41:29.300	DI	DISCONNECTED_INBOUND	SourceService	9671690D-CEBF-4242-88D3-05B781DB2D6C	1	1	3CAFE267-C82F-45F0-BCDE-16E040483637	4A16A564-099D-4ACB-9970-4C5A3775B79B	2014-10-07 06:57:53.330	1900-01-01 00:00:00.000	0	0x000000000000	-1	2	0	0	-1	0	0	0	5

Можно предположить, если такие диалоги будут копиться, то база раздуется быстро...

2.
Может ли одному сервису принадлежать 2 и более очередей? Или можно перефразировать вопрос, можно ли открыв один диалог отправить сообщение сразу в 2 и более очереди?
7 окт 14, 11:04    [16669913]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Fire and Forget: Good for the military, but not for Service Broker conversations
7 окт 14, 12:07    [16670305]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
invm,

Спасибо.

В статье написано, закрывать диалог сразу, вроде как не правильно...
Но, мне не надо его держать открытым, надо послать сообщение и закрыть диалог.

Тут идёт реюз диалога. После того как мы закрываем диалог инициатора, диалог получателя переходит в состояние "DISCONNECTED_INBOUND", если закрываем диалог получателя, он переходит в состояние "CLOSE".

И остаётся жить навеки...))) его можно грохнуть если добавить "WITH CLEANUP"


Но не могу я понять... правильно ли это всё или нет?
7 окт 14, 12:41    [16670553]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Гость5
Но не могу я понять... правильно ли это всё или нет?
Конечно не правильно. Вам уже писали неоднократно - пользуйте Query Notification.
7 окт 14, 13:15    [16670766]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
invm
Гость5
Но не могу я понять... правильно ли это всё или нет?
Конечно не правильно. Вам уже писали неоднократно - пользуйте Query Notification.


Как обычно... немногословно!

Тут напрашивается вопрос: "Почему неправильно закрывать диалог после отправки нужного количество сообщений?". Режим асинхронный, я так понимаю: "отправил сообщение и забыл", в тем более, что сообщение гуляет не среди локально удалённых серверов а внутри базы данных!

Query Notification смотрел, не думаю, что он мне подойдёт. Это уведомление об изменении данных в таблицах... мне надо не изменения отлавливать, а сообщение, которое имеет определённый формат...


Помогите разобраться... если я что-то делаю не правильно, то почему?
7 окт 14, 13:48    [16670999]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Гость5
Как обычно... немногословно!
Потому что все описано в статьях и документации, - что и как работает и для каких целей служит.
Гость5
Query Notification смотрел, не думаю, что он мне подойдёт. Это уведомление об изменении данных в таблицах... мне надо не изменения отлавливать, а сообщение, которое имеет определённый формат...
Заведите себе служебную таблицу и складывайте в нее эти сообщения. Запрос к этой таблице + Query Notification и будет решением вашей задачи.
7 окт 14, 13:58    [16671078]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость5
invm
пропущено...
Конечно не правильно. Вам уже писали неоднократно - пользуйте Query Notification.


Как обычно... немногословно!

Тут напрашивается вопрос: "Почему неправильно закрывать диалог после отправки нужного количество сообщений?". Режим асинхронный, я так понимаю: "отправил сообщение и забыл", в тем более, что сообщение гуляет не среди локально удалённых серверов а внутри базы данных!

Query Notification смотрел, не думаю, что он мне подойдёт. Это уведомление об изменении данных в таблицах... мне надо не изменения отлавливать, а сообщение, которое имеет определённый формат...


Помогите разобраться... если я что-то делаю не правильно, то почему?


вот так будет лучше "а внутри сервера"
7 окт 14, 14:22    [16671227]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
Winnipuh,

Привет, конечно сносит башню))))

я понимаю, все "гуру", для кого то обыденно и стоит лишь посмеяться над вопросом, для кого то это всё в новинку.
Все ходят во круг до около... но никто не даёт конкретного ответа.
7 окт 14, 14:50    [16671440]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость5
Winnipuh,

Привет, конечно сносит башню))))

я понимаю, все "гуру", для кого то обыденно и стоит лишь посмеяться над вопросом, для кого то это всё в новинку.
Все ходят во круг до около... но никто не даёт конкретного ответа.


invm правильно подсказал вам вариант, как решить проблему в данной вашей задаче.
Ловите, перекидываете в таблицу, и на ней висит QN.

Немногие его используют, и эти немногие используют то, что им надо, а не все тонкости. И я такой же.

Почитайте статьи на rusanu.com , он делал этот брокер, там много полезного.

Еще вот книжка
http://www.amazon.com/Server-Service-Broker-Books-Professionals/dp/1590599993
Я писал этому писателю о некоторых некорректных местах, но то мелочи, имхую полезно почитать.
7 окт 14, 15:11    [16671590]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
invm
Гость5
Как обычно... немногословно!
Потому что все описано в статьях и документации, - что и как работает и для каких целей служит.
Гость5
Query Notification смотрел, не думаю, что он мне подойдёт. Это уведомление об изменении данных в таблицах... мне надо не изменения отлавливать, а сообщение, которое имеет определённый формат...
Заведите себе служебную таблицу и складывайте в нее эти сообщения. Запрос к этой таблице + Query Notification и будет решением вашей задачи.


Ещё раз вернулся к теме Query Notification.

Ещё раз попробовал как оно работает с FDEventAlerter.
То ли компонент глючный, то ли ещё что... как только подключаюсь к Query Notification, ничего не меня в базе, происходит массове открытие диалогов, и тестовая программа погружается в длительную обработку поступающих сообщений. Ситуация дурацкая, и на форумах разработчикам задавали анологичный вопрос, что они ответили: "Мы не можем спровоцировать данную ситуацию".

Просто с обработкой сообщений (не используя Query Notification) компонент отрабатывает на отлично! Вырисовывается след. картина реализации: на каждого клиента необходимо создавать "очередь" и "сервис".
Почему я и задавал вопрос, можно ли к одному сервису подключить n'ое количество очередей?
При отправке, в цикле можно отправить одно и то же сообщение в каждую очередь.
Но,
- правильно ли оставлять открытые диалоги?
- хотелось бы избавляться от тех очередей и сервисов, которые не использовались например более месяца. В каком месте можно поднять информацию, в какое время приходило сообщение по сервису или очереди в последний раз?
7 окт 14, 15:15    [16671621]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
Всё таки, чтоб не наломать дров, решил ещё раз пробежаться по Query Notification.

Я правильно понимаю, что можно создать очередь, к которой можно подрубить хранимую процедуру, в которой в свою очередь, можно забирать полученные сообщения и покладывать в техническую таблицу. Далее на данную таблицу необходимо повесить Query Notification. И тут совсем запутался, как правильно это делается...

Может у кого завалялась хорошая статейка на русском языке с яркими примерами по реализации Query Notification?
7 окт 14, 16:20    [16672108]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Гость5
Всё таки, чтоб не наломать дров, решил ещё раз пробежаться по Query Notification.

Я правильно понимаю, что можно создать очередь, к которой можно подрубить хранимую процедуру, в которой в свою очередь, можно забирать полученные сообщения и покладывать в техническую таблицу. Далее на данную таблицу необходимо повесить Query Notification. И тут совсем запутался, как правильно это делается...

Может у кого завалялась хорошая статейка на русском языке с яркими примерами по реализации Query Notification?


в гугле миллион....

http://www.codeproject.com/Articles/12335/Using-SqlDependency-for-data-change-events
7 окт 14, 18:06    [16672855]     Ответить | Цитировать Сообщить модератору
 Re: Опять ServiceBroker, помогите разобраться  [new]
Гость5
Guest
Winnipuh,
Спасибо конечно. Но как включить QN на таблицу так и не понял, в силу того что ado.net нет на дельфях((( поэтому мильен примеров непроканает. Может есть у кого статейка другая статейка?
7 окт 14, 21:20    [16673490]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить