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

Есть программа написанная на Delphi XE6, назовём её "клиент", доступ к данным идёт через компоненты FireDAC. Обычная архитектура "Клиент-Сервер".

Необходимо клиентам, которые имеют коннект к базе, получать сообщения от сервера об каких либо изменениях. Как я понимаю, это реализуется черз специальный сервис MSSQL "Service Broker".

Познакомился с Service Broker'ом (на базовом уровне) и решил сделать маленькую тестовую программу (Delphi XE6 + компоненты FireDAC). В FireDAC имеется замечательный компонент TFDEventAlert, который перехватывает сообщения из очереди.

На стороне сервера, создал все необходимые компоненты:

CREATE MESSAGE TYPE [TestType] VALIDATION = NONE 
GO

CREATE CONTRACT [TestContract] ([TestType] SENT BY ANY)
GO


...
...
...

DECLARE @convHandler uniqueidentifier

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

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

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


Сообщение успешно приходит одному клиенту из многих (скорей всего первому, который забрал сообщение из очереди), остальные остаются не уведомлены.

Теперь главный вопрос: Как сделать так, чтоб все клиенты получили уведомление?

у меня есть предположения:
1.
возможно при создании или "Сервиса" или "Очереди" неуказан параметр для рассылки всем подписчикам, а не одному
2.
необходимо использовать служебные сервисы:
"http://schemas.microsoft.com/SQL/Notifications/EventNotificationService"
или
"http://schemas.microsoft.com/SQL/Notifications/QueryNotificationService"
если, да, будьте любезны немного описать механизм взаимодействия и пример отправки такого сообщения. Идеально хорошая статейка на эту тему.


Буду признателен за любую информацию. Спасибо!
5 окт 14, 10:18    [16662451]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
invm
Member

Откуда: Москва
Сообщений: 9722
Гость5
Теперь главный вопрос: Как сделать так, чтоб все клиенты получили уведомление?
Слать каждому, ибо в SB нет возможности мультикастинга.
5 окт 14, 10:52    [16662477]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Гость5
Guest
invm,

Слать каждому, это как? на каждого делать свою очередь, тип сообщения и т.п.
немного странновато, особенно когда зарнее неизветсно количество клиентов.

Должен же быть какой то способ... в SB ненашёл ничего подобного, чтобы могло подойти, но есть "обёртка" под названием EventNotification, поидеи она должна уведомлять подписчиков определённого сервиса... но как это сделать, пример бы или статейку на эту тему
5 окт 14, 11:57    [16662579]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
invm
Member

Откуда: Москва
Сообщений: 9722
Гость5,

Слать каждому означает, что каждый клиент открывает свой собственный диалог.
5 окт 14, 12:30    [16662634]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Гость5
Guest
invm,

Покапался в компонентом TFDEventAlert, но возможность открыть диалог не нашёл.

Могу предположить, что при активации компонента (FDEventAlert.Active = True) идёт регистрация не диалога а чего-то другого. Я к чему, возможно можно открыть диалог на сервере с параметром клиента?

на данный момент диалог открывается, но с каким клиентом?!

Если сводится всё действительно к диалогу, то есть странный момент, если закрыть одного клиента, то тут же сообщения принемает другой... непонимаю...
5 окт 14, 18:29    [16663320]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
invm
Гость5
Теперь главный вопрос: Как сделать так, чтоб все клиенты получили уведомление?
Слать каждому, ибо в SB нет возможности мультикастинга.


Rusanu: How to Multicast messages with SQL Server Service Broker

http://rusanu.com/2011/07/20/how-to-multicast-messages-with-sql-server-service-broker/
6 окт 14, 12:54    [16665570]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
invm
Member

Откуда: Москва
Сообщений: 9722
Winnipuh
Rusanu: How to Multicast messages with SQL Server Service Broker

http://rusanu.com/2011/07/20/how-to-multicast-messages-with-sql-server-service-broker/
И что, это не есть "слать каждому"?
6 окт 14, 13:13    [16665691]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
invm
Winnipuh
Rusanu: How to Multicast messages with SQL Server Service Broker

http://rusanu.com/2011/07/20/how-to-multicast-messages-with-sql-server-service-broker/
И что, это не есть "слать каждому"?


По сути то да, всего лишь расширение синтаксиса, но в частности хранит один экземпляр сообщения.
6 окт 14, 13:48    [16665875]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Гость5
Guest
Winnipuh,

Спасибо за статейку, там речь идёт о 2012м MSSQL'е.
Я использую 2008.

Но там запутано как то всё. Пока не могу разобраться как открыть диалог со стороны клиента? Конечно вопрос не по форуму, но всё же задам: Может кто работал с компонентом TFDEventAlert (FireDAC) и MSSQL и знает как организовать CALL BACK?
6 окт 14, 14:03    [16665957]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
invm
Member

Откуда: Москва
Сообщений: 9722
Гость5,

Вы зациклились на TFDEventAlert, а он работает через Query Update Notification.
6 окт 14, 14:31    [16666112]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Гость5
Guest
invm,

Спасибо что помогаете.
TFDEventAlert перехватывает сообщения и через диалог.

Но, по поводу зациклился... может есть другие компоненты под Delphi XE6? подскажите, буду смотреть...
6 окт 14, 15:11    [16666446]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Гость5,

День добрый!
Не поделитесь дальнейшим развитием событий? У меня появилась аналогичнейшая задача. Стою перед выбором, то ли в сторону SB идти, то-ли писать свою сервис на сервере (который таки будет выступать в роли клиента, посылающего сообщение), слушать TCP порт на клиенте приложения (который будет выступать сервером для клиента, посылающего сообщения) и при получении данных уведомлять об этом пользователя. Но не хотелось бы создавать велосипед, если SB позволяет это малой кровью решить.
7 ноя 14, 10:52    [16810473]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать Service Broker для CALL BACK сообщений.  [new]
Гость5
Guest
Romka-Fes,

Привет, кучу времени пришлось потратить на изучение ServiceBroker'а

"Штука" очень крутая! и возможностей там очень, очень много!

Не советую писать свой собственный сервис т.к. такую схему писал сам пару лет назад, в итоге очень много подводных камней, которые приходилось либо админить либо обходить. Теперь такой подход горит в топке...


Удачи!
24 ноя 14, 10:47    [16894908]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить