Как при помощи SqlDependency отслеживать изменения в базе MSSql и отправлять появившиеся данные серверу посредством SignalR

243
08 сентября 2017, 19:23

Разрабатываю windows-сервис. Он должен при помощи SqlDependency отслеживать изменения в базе MSSql (добавление данных) и отправлять появившиеся данные серверу посредством SignalR. Поскольку обе технологии для меня новые, в голове полная каша. Прошу покритиковать меня и, возможно, подсказать более рациональный путь. Пока что выглядит это так: Сервис при старте создает новый поток, в котором будут происходить основные действия:

protected override void OnStart(string[] args)
        {            
            Thread thread = new Thread(new ThreadStart(Dispatch));
            thread.Start();            
        }

Метод Dispatch должен:

1) Подключиться к серверному хабу. Учитываем, что сервер, возможно, не будет доступен - при этом возникнет исключение. Если поймали исключение, ждем некоторое время и опять делаем попытку подключиться. И так до бесконечности.

2) Запросить дату и время, которой датирована последняя известная серверу запись (например, сообщение чата). Если поймали исключение (сервер внезапно отвалился), ждем некоторое время и переходим к пункту 1.

3) Выбрать из локальной базы записи, начиная с даты, возвращенной с сервера.

а) Если такие данные есть, передаем их поочередно на сервер, обновляя при этом переменную с датой. Если в какой-то момент сервер вернул исключение, возвращаемся к пункту 1.

б) Если таких данных нет (или были, но мы их все только что передали на сервер в пункте а), привязываемся к событию OnChange экземпляра класса SqlDependency и ждем появления.

Я вижу структуру кода метода Dispatch примерно следующей:

void Dispatch()
    {
        DateTime ServerDate;
        while(true)
        {
            try
            {
                ConnectedToServerHub();
                ServerDate=GetServerDate();
                GetNewRecordAndDistatch(ServerDate);                
            }
            catch
            {
            }
            Thread.Sleep(1000);
        }
    }

В методе GetNewRecordAndDistatch(DateTime ServerDate) происходит выборка данных и отправка:

void GetNewRecordAndDistatch(DateTime ServerDate)
    {
        List<Record> records=GetNewRecordFromDB(ServerDate);
        while (records.Count>0) 
            {
                StartDispatch(records);//при успешной отправке где-то здесь обновляется дата ServerDate             
                records=GetRecordFromDB(ServerDate);
            }
        CreateDependency(ServerDate);
    }

В методе CreateDependency(DateTime ServerDate) создается экземпляр класса SqlDependency и к нему привязывается событие:

...
SqlDependency dependency=new SqlDependency (command);
dependency.OnChange+=new OnChangeEventHandler(dependency_OnChange);
...

В обработчике события dependency_OnChange вызывается метод на отправку данных и опять ждем прихода данных:

void dependency_OnChange(...)
    {
        GetNewRecordAndDistatch(ServerDate);
    }

Проблемы:

1) Я понимаю, что как только отработает GetNewRecordAndDistatch(ServerDate); в Dispatch(){}, пойдет следующая итерация цикла while(true){}, а мне надо, чтобы на следующую итерацию был переход только в результате исключения

2) Меня смущает, что в методе CreateDependency(DateTime ServerDate) привязывается событие, а из события опять вызывается метод. Ведь это приведет к бесконечном увеличению подписчиков на событие, верно? Как от этого избавиться, мне непонятно

3) Не нравится, что везде за собой надо таскать дату, но как без нее отслеживать именно новые данные, а не выгребать все подряд?

READ ALSO
Почему переменная не является функцией

Почему переменная не является функцией

В первом случае (закомментированом) все нормально работает, но когда пытаюсь присвоить переменной onReady функцию через сеттер, то в setTimeout пишет...

379
return не возвращает нужное значение

return не возвращает нужное значение

Функция считает сколько раз нужно умножить цифры числа друг на друга чтобы получить одну цифруВсё работает, но возвращаемая переменная в console

270
Ошибки модуля jsdom при запуске файла на nodejs

Ошибки модуля jsdom при запуске файла на nodejs

Всем привет! Помогите пожалуйста разобратьсяПри запуске js файла в консоли возникают следующие ошибки (jsdom 11

291
В чём разница между var obj{} и var obj[]?

В чём разница между var obj{} и var obj[]?

Ведь и то, и то массив, но разница есть

348