Триггеры событий на основе таймера

В настоящее время я работаю над проектом с особыми требованиями. Краткий их обзор выглядит следующим образом:

  • Данные извлекаются из внешних веб-сервисов
  • Данные хранятся в SQL 2005
  • Данные обрабатываются через веб-интерфейс
  • Служба Windows, которая взаимодействует с веб-службами, никак не связана с нашим внутренним веб-интерфейсом, кроме как через базу данных.
  • Связь с веб-службами должна быть привязана ко времени и инициироваться посредством вмешательства пользователя в веб-интерфейс.

Текущая (предварительная) модель запуска связи веб-службы осуществляется через таблицу базы данных, в которой хранятся запросы запуска, сгенерированные в результате ручного вмешательства. Я действительно не хочу иметь несколько механизмов триггеров, но хотел бы иметь возможность заполнять таблицу базы данных триггерами в зависимости от времени вызова. Как я вижу, есть два способа добиться этого.

1) Адаптируйте таблицу триггеров для хранения двух дополнительных параметров. Один из них: «Это основано на времени или добавлено вручную?» и поле, допускающее значение NULL, для хранения деталей синхронизации (точный формат будет определен). Если это триггер, созданный вручную, пометьте его как обработанный при срабатывании триггера, но не в том случае, если это триггер по времени.
или
2) Создайте вторую службу Windows, которая создает триггеры «на лету» через определенные промежутки времени.

Второй вариант мне кажется выдумкой, но управление вариантом 1 может легко превратиться в кошмар программирования (как узнать, вернул ли последний опрос таблицы событие, которое нужно сгенерировать, и как потом его остановить повторный запуск в следующем опросе)

Я был бы признателен, если бы кто-нибудь мог уделить несколько минут, чтобы помочь мне решить, какой маршрут (один из этих двух или, возможно, третий, не указанный в списке) выбрать.


person ZombieSheep    schedule 06.08.2008    source источник


Ответы (3)


Почему бы не использовать задание SQL вместо службы Windows? Вы можете инкапсулировать весь свой «триггерный» код БД в хранимых процедурах. Затем ваш пользовательский интерфейс и задание SQL могут вызывать одни и те же хранимые процедуры и создавать триггеры одинаковым образом, будь то вручную или с временным интервалом.

person brendan    schedule 07.08.2008

Я вижу это так.

У вас есть служба Windows, которая играет роль планировщика, и в ней есть несколько классов, которые просто вызывают веб-сервисы и помещают данные в ваши базы данных.

Таким образом, вы также можете использовать эти классы непосредственно из WebUI и импортировать данные на основе триггера WebUI.

Мне не нравится идея хранить сгенерированное пользователем действие в качестве флага (триггера) в базе данных, где какая-то служба будет опрашивать его (с интервалом, который не контролируется пользователем) для выполнения этого действия.

Вы даже можете преобразовать весь код в исполняемый файл, который затем можно запланировать с помощью планировщика Windows. И вызывайте один и тот же исполняемый файл всякий раз, когда пользователь запускает действие из веб-интерфейса.

person Vaibhav    schedule 06.08.2008

@Вайбхав

К сожалению, физическая архитектура решения не допускает прямой связи между компонентами, кроме веб-интерфейса для базы данных и базы данных для службы (которая затем может обращаться к веб-службам). Я, однако, согласен с тем, что повторное использование коммуникационных классов было бы идеальным здесь — я просто не могу сделать это в рамках нашего бизнеса*

* Разве не всегда технически «лучшее» решение блокируется внешними факторами?

person ZombieSheep    schedule 06.08.2008