Планировщик заданий Windows и служба Windows для приложения.Net
Я знаю, что варианты этой темы уже задавались, но вот моя ситуация:
У меня около 30 приложений интерфейса FTP. Каждый интерфейс имеет свои собственные требования и конфигурацию, но в основном он загружает файлы с исходного сервера - иногда ежедневно, иногда каждую минуту (некоторые, возможно, даже запланированные в секундах)
Для своей первоначальной разработки я написал библиотеку классов C#, которая выполняет всю работу по FTP. Это приложение (будь то консольное приложение или служба Windows), скорее всего, будет работать под Windows Server 2012.
Теперь идет следующая часть, и я пытаюсь выбрать между:
1) Написание консольного приложения (или скрипта powershell?), Которое принимает данные командной строки и файл конфигурации для каждого интерфейса. Я бы планировал это с помощью Windows Task Scheduler. Для развертывания этих интерфейсов я мог бы создать командный файл, который использует "schtasks.exe" для создания и настройки задачи. Одна задача для каждого интерфейса. Звучит легко, peasy...
ИЛИ ЖЕ
2) Написать приложение служб Windows... но здесь я запутался. Я создаю и устанавливаю сервис для каждого из моих интерфейсов? (то есть единственное, что может отличаться - это файл конфигурации). Или я создаю основной сервис, который порождает потоки для каждого интерфейса, определенного в одном файле конфигурации?
Если я сделал это как единый сервис, как мне управлять обслуживанием / развертыванием этого? Если я остановлю службу, она не затронет все интерфейсы? И как мне выполнить фактическое планирование? Я прочитал предложение использовать планировщик Quartz.Net или просто.NET Timers.
- - -
Некоторые дополнительные мысли: Вот некоторые чтения Stackru, которые поднимают эти темы / проблемы:
Служба Windows против запланированной задачи Запланированное консольное приложение против службы Windows? Когда уместно использовать каждый
Задачи планировщика задач
- Элемент списка
- Может быть нужно войти в систему? (Я читал, что это не так)
- Проблемы при смене пароля администратора машины (я читал, что это не так)
- Проблемы с запуском в учетных записях высокого уровня (NetworkService, LocalSystem или User)
- Проблема с несколькими процессами / длительными транзакциями. Это было бы очень плохо для меня, например, если бы два процесса пытались загрузить (и удалить) один и тот же исходный файл FTP.
- Опыт многих показывает, что это не так стабильно / надежно, как службы Windows, особенно в более ранних операционных системах до Windows7
- Меньшая поддержка инфраструктуры (например, политики отказов при повторных попытках, мониторинг и т. Д.)
- Проблемы при планировании в секундах...
Проблемы службы Windows
- Элемент списка
- Потенциальные проблемы с таймерами
- Более сложный
Консольное приложение + задачи запланированных задач
- Элемент списка
- Не может работать в фоновом режиме - поэтому на хост-сервере будут запускаться командные строки. Это серьезная проблема. Если у меня 30 интерфейсов FTP, и каждый из них запланирован для запуска каждую минуту / час, это много окон!!!
- Как мне обойти это? Использовать сценарии PowerShell вместо этого?
Ждем некоторых отзывов и примеров кода / сценариев, если это уместно, также высоко ценится.
Спасибо
1 ответ
Вы можете получить доступ к вашему классу C# в PowerShell, используя либо add-type
или же [System.Reflection.Assembly]
- ознакомьтесь с этой публикацией SO для примеров. - Могу ли я получить доступ к своему пользовательскому классу.NET из PowerShell?
Вы можете сделать все это в PowerShell, используя start-job
и тому подобное, но тогда вашему управляющему сценарию потребуется много усилий.
Я хотел бы использовать встроенные (в версии 3) командлеты Powershell для создания / изменения запланированных заданий в планировщике задач и пользовательских триггерах - http://blogs.technet.com/b/heyscriptingguy/archive/2012/09/18/create-a-powershell-scheduled-job.aspx
Запланируйте задания, в которых выполняются сценарии PowerShell.ps1, по одному для каждой передачи или группы связанных передач, например Monthly_Payroll_xfer.ps1
, Weekly_Expenses_xfer.ps1
с логикой, относящейся к этой передаче, оповещениями по электронной почте об успехе / неудаче и т. д.
Единственное, что не решает, - это один и тот же файл / место назначения, обрабатываемые в одно и то же время, но вы можете потенциально проверить отдельные сценарии при запуске, если они уже запущены - см. Принятый ответ на это сообщение - Убедитесь, что только 1 экземпляр PowerShell Скрипт работает в любой момент времени
Что касается приглашений Windows, вы можете запустить запланированное задание от имени пользователя, который не будет входить в систему, и вы не увидите командные окна powershell, так как они будут находиться на другой консоли - не устанавливайте -noexit
переключатель powershell.exe, чтобы они ушли, когда закончите.
Пришлось сделать это на работе для инструмента, который работает только как графический интерфейс, а не как служба, и не может быть обманут с srvany
и т. д. - мы устанавливаем запланированное задание, которое запускается (при запуске) в качестве учетной записи службы и запускает скрипт powershell, который запускает GUI.exe
Затем мы используем сценарии powershell для stop-process
чтобы убить его, отключите / включите задачу (например, отключите / включите службу) и одну, чтобы запустить задачу.
Это комок, но он работает.
Извинения. Я не особо привел примеры кода, делаю это на своем телефоне, но могу дать вам идеи.
Вы также можете сделать все это в C# - у нас есть собственное приложение с SQL-сервером, которое делает именно то, что вы пытаетесь достичь, очень успешно, многопоточное, с очень большими объемами, которые проверяются на это..
Тем не менее, интеллектуальная собственность моих работодателей и другие правила не позволяют мне рассказывать об этом больше, чем это:-(