Приложение "запланированные задачи", управляемое базой данных, на C # - нужен совет по синтаксису восстановления

Для рабочего проекта я беру на себя задачу создать службу Windows C # .NET, которая будет работать круглосуточно и без выходных. По сути, программа просто перемещает файлы (на основе заданного пути и регулярного выражения) между различными местоположениями - из / в HTTP, сетевые пути и FTP. Администратор планирует эти задания на странице администрирования в ASP.NET, где все задания будут храниться в базе данных. Казалось бы, самая сложная часть - это планирование этих заданий - очень просто запланировать выполнение задач на определенный день в определенное время, но оно также должно быть достаточно надежным, чтобы задачи могли выполняться каждый день, каждый рабочий день, каждый определенный день. месяца или даже каждые несколько секунд / минут. Я пришел к выводу, что самый простой способ сохранить эту информацию о расписании - использовать синтаксис cron (http://adminschoice.com/crontab-quick-reference) в базе данных.

В приложении есть таймер для проверки базы данных на наличие изменений каждые 10 минут, но основная проблема, с которой я сталкиваюсь, - это получение задач, которые необходимо выполнить - я думаю, одним из вариантов было бы просто извлекать все каждые 10 минут и проверять каждую отдельную строку. чтобы увидеть, должны ли они быть выполнены. Но я считаю, что это очень неэффективный и технически ленивый способ - как бы вы, ребята, это сделали?

Я знаю, что выполнение запланированных задач Windows было бы намного проще, но похоже, что моему боссу это не нужно.

Заранее благодарим всех, кто может дать несколько советов / советов.


person Chris 7197    schedule 27.09.2010    source источник
comment
Получить нового начальника, который понимает, что каждый использует правильные инструменты для правильной работы?   -  person Oded    schedule 28.09.2010
comment
Думали ли вы об использовании Quartz.Net для этого? Кажется подходящим выбором (quartznet.sourceforge.net)   -  person Jason Irwin    schedule 28.09.2010


Ответы (2)


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

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

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

Тем не менее, я согласен с @Oded: убедите вашего начальника использовать запланированные задачи Windows. Если ему не нравится этот интерфейс, вы можете попросить свое веб-приложение (или службу, с которой оно взаимодействует) взаимодействовать с API планировщика заданий Windows. Codeplex имеет оболочку: http://taskscheduler.codeplex.com/

person Jim Mischel    schedule 27.09.2010

Взгляните на Quartz.NET - почти все, что вам нужно. Вы также можете запланировать его, используя выражения Cron.

Если вы сохраните достаточно информации о каждом задании в базе данных, вы сможете создавать задание каждый раз при запуске службы. Вы можете периодически опрашивать об изменениях и обновлять правила задания.

Размещение этого в службе Windows - хороший способ сделать это - позволяет вам контролировать его работу и предоставляет стандартные механизмы для его перезапуска в случае его падения (net start xxx) и т. Д. Намного лучше, чем запланированные задачи.

person Michael Shimmins    schedule 27.09.2010