1

Для простоты я собираюсь использовать сценарий отправки писем с днем ​​рождения в клиентскую базу ~ 1,000,000 клиентов (хранящихся в БД), так как мой собственный сценарий I ' м, пытающийся решить, схож.Шаблоны проектирования для C# Службы Windows, отправляющие сообщения с датой

Как правило, решением, которое я бы разработал, было бы создание службы Windows, запланированной с использованием Quartz.net, которая будет опросить всю таблицу клиентов (хотя и проиндексирована), ища дни рождения, которые соответствуют сегодняшней дате (или всякий раз, когда выполняется Служба). Служба будет охватывать список клиентов и отправлять электронную почту и т. Д. Это планируется запустить, скажем, один раз в день.

Мне было интересно, если это нормальный подход к решению этой проблемы или есть лучший способ/другой шаблон? Опрос базы данных мне кажется ... немного вонючей.

Я думаю, что, поскольку мы знаем день рождения клиентов, когда они подписываются (например, их день рождения может быть через несколько недель), следует Я на момент подписания, проактивно настроил график для запуска?

Одна вещь, которую я пытаюсь избежать, - это опрос базы данных, когда мы знаем, что в тот день нет дней рождения (хорошо, из 1 000 000 клиентов вы ожидаете, что их было несколько! ... но давайте притворимся, что их нет в течение целого месяца ..) - какое решение могло бы избежать этой проблемы?

Благодаря

+3

Выполнение запроса данных один раз в день, даже если результатов нет в этот день, похоже, что это не проблема. Я действительно сомневаюсь в использовании службы Windows с системой планирования, хотя запланированное консольное приложение кажется более применимым к этому сценарию. (Служба Windows всегда будет работать, а не запланирована.) – David

+1

Это то, что я тоже делаю. Я создаю консольные приложения, которые выполняют эти задачи, и планирую их с помощью Планировщика заданий. –

+0

Спасибо за ответы - я использую Topshelf и Quartz.net. Локально он работает как консольное приложение, но оно установлено/размещено в службе Windows. Само планирование управляется кварцем. –

ответ

1

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

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

Как вы упомянули, вы можете настроить расписание, когда клиент подписывается. Если вы пройдете этот маршрут, вы можете обнаружить изменения с помощью SqlDependancy, а затем создать расписание в событии OnDependencyChange.

void OnDependencyChange(object sender, SqlNotificationEventArgs e) 
{ 
    // Create schedule. 
}