Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2 / 20 сообщений из 20, страница 1 из 1
16.02.2018, 16:28
    #39603176
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Добрый день.

Перевод с XE6 на DX10.2

Две разные виртуалки, на одной XE6 на другой DX10.2, одна и та же база на MSSQL2008R2.

На XE6 уведомления идут на DX10.2 нет(( Уже голову сломал.

Сам код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
    FEventAlerter.Connection          := Conn;
    FEventAlerter.Options.Synchronize := True;
    
    FEventAlerter.Names.Add('SERVICE=MyService');
    FEventAlerter.Names.Add('QUEUE=MyQueue');

    FEventAlerter.OnAlert             := ReceiveMessageEvent;

    FEventAlerter.Register;



Самое интересное из очереди сообщения таки уходят т.к. компонента их забирает, но "OnAlert" событие не срабатывает.

Люди помогите...
...
Рейтинг: 0 / 0
19.02.2018, 06:59
    #39603887
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Разобрался... дело оказалось в том что нужно правильно поддерживать "Query Notification Messages" в MSSQL. Начиная с XE7 ситуация поменялась. В XE6 если формат удовлетворяет "Query Notification Messages", то тело сообщения, которое закрыто в <qn:Message>, вычленяется и передаётся слушателю, если формат не соответствует, то передавалось целиком, а вот начиная с XE7 и выше, если формат не верный то сообщение игнорируется компонентой.
...
Рейтинг: 0 / 0
19.02.2018, 17:27
    #39604384
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Игорь_UUSсообщение игнорируется компонентой.Без всяких ошибок?
...
Рейтинг: 0 / 0
19.02.2018, 18:50
    #39604408
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
_Vasilisk_,

а куда оно его отправит, это ошибко, если Event Alerter в отдельном невизуальном потоке живет?

на сухожую тему недавно был срач между Владом Хорсуном (Firebird) и автором AnyDAC
...
Рейтинг: 0 / 0
19.02.2018, 19:53
    #39604428
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Ariochа куда оно его отправит, это ошибкоНапример, куда-нибудь в OnError. Сообщения же он умудряется доставлять целевому потоку?

Даже банальная конструкция
Код: pascal
1.
2.
3.
4.
try
  raise Exception.Create('Invalid format message');
except
end;

уже предупредит разработчика в IDE, что что-то пошло не так
...
Рейтинг: 0 / 0
20.02.2018, 09:06
    #39604542
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Игорь_UUS, покажи что и как делал, что:

1) "... если формат не верный то сообщение игнорируется компонентой"
2) "дело оказалось в том что нужно правильно поддерживать "Query Notification Messages" в MSSQL."
...
Рейтинг: 0 / 0
20.02.2018, 18:19
    #39605050
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Dmitry ArefievИгорь_UUS, покажи что и как делал, что:

1) "... если формат не верный то сообщение игнорируется компонентой"
2) "дело оказалось в том что нужно правильно поддерживать "Query Notification Messages" в MSSQL."


Добрый день Дмитрий.

Если в очередь закинуть сообщение, например "bla-bla-bla and bla-bla-bla", то начиная с XE7 просто будет проигнорировано компонентой, безо всяких уведомлений (наверное это больше всех ставило в ступор!). Если сообщение будет отправлено согласно " https://technet.microsoft.com/en-us/library/ms189308(v=sql.105).aspx", то всё ок.

Как нашёл?! Пришлось "ковырять" исходники, в юните FireDAC.Phys.MSSQL, функция "function TFDPhysMSSQLEventAlerter.ProcessNotifications: Boolean;"

проблема в этом куске:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
for i := 0 to FMessageTab.Rows.Count - 1 do begin
    sMsg := FMessageTab.Rows[i].AsString['message_body'];
    sType := GetAttr('type');
    sSrc := GetAttr('source');
    Result := CompareText(sType, 'subscribe') <> 0;
    if (CompareText(sType, 'change') = 0) and (CompareText(sSrc, 'timeout') <> 0) or
       not Result then begin
      sInfo := GetAttr('info');
      sVal := GetValue('qn:Message');
      FMsgThread.EnqueueMsg(TFDPhysMSSQLEventMessage.Create(sVal, sType, sSrc, sInfo));
    end;
  end;



А именно, где происходит потеря сообщения, которое не удовлетворяет нотифакции майкрасофт:
Код: pascal
1.
2.
if (CompareText(sType, 'change') = 0) and (CompareText(sSrc, 'timeout') <> 0) or
       not Result then begin
...
Рейтинг: 0 / 0
20.02.2018, 18:21
    #39605051
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Dmitry Arefiev,

Я думаю нужно соблюдать формат, но и основной поток нужно как то проинформировать, что формат не верный...
...
Рейтинг: 0 / 0
20.02.2018, 18:23
    #39605052
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Это понятно ... Меня интересовали два примера кода отсылки сообщений:
1) Когда сообщение не доходит
2) Когда сообщение доходит
...
Рейтинг: 0 / 0
20.02.2018, 18:32
    #39605058
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Dmitry Arefiev,

В FireDAC есть ещё огромный "пробел"))) (по крайне мере он присутствует в XE6) Связан он с использованием TVP переменных в хранимых процедурах. Если начинаешь использовать более одной такой переменной в хранику приходит заполненная только одна. Вы тогда написали что проблема в MSSQL (или в его драйвере)

напомню топик:
http://www.sql.ru/forum/1127442/firedac-storedproc-ispolzovanie-peremennyh-tablichnogo-tipa-vozmozhno-bag-firedac?hl=igor888

Скажите, изменилось ли что-нибудь в этом плане? я сейчас использую DX10.2.


и есть врой момент, TVP переменный вообще не работают с драйвером "неатив-клиент 11-й", только с 10-ым. Сейчас имеется поддержка 11-го драйвера?
...
Рейтинг: 0 / 0
20.02.2018, 18:37
    #39605060
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Dmitry ArefievЭто понятно ... Меня интересовали два примера кода отсылки сообщений:
1) Когда сообщение не доходит
2) Когда сообщение доходит

Не совсем понял вопроса, Вам скрипт нужен на TSQL?
...
Рейтинг: 0 / 0
20.02.2018, 20:48
    #39605115
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Игорь_UUSНе совсем понял вопроса, Вам скрипт нужен на TSQL?
На чем угодно.
...
Рейтинг: 0 / 0
21.02.2018, 08:21
    #39605245
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Dmitry ArefievИгорь_UUSНе совсем понял вопроса, Вам скрипт нужен на TSQL?
На чем угодно.

Дмитрий здравствуйте.

Вот так будет работать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-- https://technet.microsoft.com/en-us/library/ms189308(v=sql.105).aspx
-- Query Notification Messages:
DECLARE @Message NVARCHAR(512) = (
  '<qn:QueryNotification '+
    'xmlns:qn="http://schemas.microsoft.com/SQL/Notifications/QueryNotification" '+
    'type="change" source="data" info="truncate"> '+
      '<qn:Message>' + 'Test messege' + '</qn:Message> '+
  '</qn:QueryNotification>'
)

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler 
    MESSAGE TYPE [DEFAULT] (@Message)



Вот так сообщение проигнорируется:
Код: sql
1.
2.
3.
4.
5.
6.
7.
-- https://technet.microsoft.com/en-us/library/ms189308(v=sql.105).aspx
-- Query Notification Messages:
DECLARE @Message NVARCHAR(512) = 'Test messege'

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler 
    MESSAGE TYPE [DEFAULT] (@Message)
...
Рейтинг: 0 / 0
21.02.2018, 08:27
    #39605249
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Dmitry Arefiev,

Дмитрий скажите как обстоят дела с TVP на DX10.2? (вопросы задал выше)
...
Рейтинг: 0 / 0
21.02.2018, 11:36
    #39605356
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Игорь_UUS,

Я MSSQL в глаза не видел, но в документации сказано These contracts must allow the message type to be sent from this side of the conversation. For example, the target services of the conversations may only send messages specified in the contract as SENT BY TARGET or SENT BY ANY. If this clause is omitted, the message is of the message type DEFAULT.Может нужно не указывать тип для текстовых сообщений?
...
Рейтинг: 0 / 0
21.02.2018, 13:01
    #39605454
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
_Vasilisk_Игорь_UUS,

Я MSSQL в глаза не видел, но в документации сказано These contracts must allow the message type to be sent from this side of the conversation. For example, the target services of the conversations may only send messages specified in the contract as SENT BY TARGET or SENT BY ANY. If this clause is omitted, the message is of the message type DEFAULT.Может нужно не указывать тип для текстовых сообщений?

Вы это про что? При чём тут "тип для текстовых сообщений", и где его нужно не указывать)))
...
Рейтинг: 0 / 0
21.02.2018, 14:39
    #39605550
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Я про это
Код: sql
1.
2.
3.
4.
DECLARE @Message NVARCHAR(512) = 'Test messege'

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler (@Message)
...
Рейтинг: 0 / 0
21.02.2018, 15:25
    #39605584
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
_Vasilisk_Я про это
Код: sql
1.
2.
3.
4.
DECLARE @Message NVARCHAR(512) = 'Test messege'

IF NOT @convHandler IS NULL
  SEND ON CONVERSATION  @convHandler (@Message)




Бррр, я же написал, по какой причине нотифакция не работает... причём тут "тип для текстовых сообщений"? На уровне MSSQL всё ок, компонента забирает сообщения
...
Рейтинг: 0 / 0
21.02.2018, 15:54
    #39605595
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
Игорь_UUSя же написал, по какой причине нотифакция не работает.Не потому ли, что Вы декларируете отсылку в одном формате (MESSAGE TYPE [DEFAULT]), а посылали в другом?
...
Рейтинг: 0 / 0
22.02.2018, 10:52
    #39605998
Игорь_UUS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2
_Vasilisk_Игорь_UUSя же написал, по какой причине нотифакция не работает.Не потому ли, что Вы декларируете отсылку в одном формате (MESSAGE TYPE [DEFAULT]), а посылали в другом?

Вы писали ранее "Я MSSQL в глаза не видел", я думаю дальнейшее обсуждение про то как работает ServiceBrocker и что есть "SEND ON CONVERSATION" является бесперспективным! Вы говорите о том, о чём не имеете понятия как оно работает и устроено!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 10.2: TFDEventAlerter не работает с MSSQL 2008R2 / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]