Планировщик заданий 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-сервером, которое делает именно то, что вы пытаетесь достичь, очень успешно, многопоточное, с очень большими объемами, которые проверяются на это..

Тем не менее, интеллектуальная собственность моих работодателей и другие правила не позволяют мне рассказывать об этом больше, чем это:-(

Другие вопросы по тегам