Лучший способ запланировать отправку сообщений с помощью службы Windows в C # - PullRequest
0 голосов
/ 02 июля 2011

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

Первая мысль была:

У меня есть список сообщений, которые необходимо отправлять в запланированное время, каждое из них хранится в центральной базе данных SQL.

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

* * 1010

ScheduleMessages проверит базу данных на наличие неотправленных сообщений, которые должны быть отправлены в течение следующих 30 минут, а затем пометит их в базе данных как:

ScheduleActivated = 1

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

Будет установлен флажок во время отправки сообщения, оно отправит сообщение и пометит в базе данных как успешное.

Основная проблема в этом заключается в том, что у меня повсюду будут таймеры, и если запланировано несколько сотен сообщений одновременно, это, вероятно, будет либо неэффективным, либо полностью упадет.

После переоценки я подумал о решении 2

Моя другая идея состояла в том, чтобы в сервисе работал 1 таймер, который срабатывает один раз каждые 10 минут. Каждый раз, когда он тикает, он запускает метод, который собирает каждое отдельное сообщение, которое должно быть отправлено в любой точке вплоть до этого времени, в список, а затем обрабатывает их по одному.

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

Будет ли работать остановка таймера после его включения в течение 10 минут, затем сброс на ноль и запуск снова после отправки сообщений.

Есть ли 3-е решение проблемы, которое лучше, чем выше?

Ответы [ 3 ]

2 голосов
/ 02 июля 2011

Мы реализовали это в одном проекте, который работал для нас:

  • Все сообщения, записанные в таблицу с временем отправки
  • Сервис, который проверяет каждые x минут, если естьчто-то для отправки
  • Когда служба отправляет сообщение, она также отмечает сообщение как отправленное (обновить время отправки с нулевого до фактического времени отправки)

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

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

1 голос
/ 02 июля 2011

Отказ от фиксированного интервала. В Windows имеется множество способов для сна в течение определенного времени, включая функцию сна, таймеры ожидания и т. Д.

Некоторые из них доступны в .NET, например, WaitHandle.WaitAll принимает время сна и событие, таким образом, ваш поток может ждать до следующего запланированного элемента, но также может быть разбужен запросом на изменение расписания.

0 голосов
/ 02 июля 2011

По моему мнению, служба планирования должна отвечать только за проверку расписаний, а любая работа должна передаваться отдельной службе. Служба планирования не должна заботиться о запланированных работах. Попробуйте реализовать интерфейс рабочего элемента, который содержит метод execute. Таким образом, исполняемый объект может сам обрабатывать внутренние компоненты и не должен знать о службе планирования. Для планирования вы проверили quartz.net?

...