Какие существуют подходы к созданию запланированных задач для веб-приложений с отдельным веб-приложением или приложением для настольных ПК или без него?
Запланированные задачи для веб-приложений
Ответы (11)
Если мы говорим о платформе Microsoft, то я всегда разрабатывал отдельную службу Windows для обработки таких пакетных задач.
Вы всегда можете ссылаться на те же сборки, которые используются вашим веб-приложением, чтобы избежать неприятного дублирования кода.
Джефф обсуждал это в блоге Stack Overflow — https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
По сути, Джефф предложил использовать CacheItemRemovedCallback в качестве таймера для вызова определенных задач.
Я лично считаю, что автоматизированные задачи должны обрабатываться как служба, запланированная задача Windows или задание в SQL Server.
Под Linux проверьте cron.
Я думаю, что сам Stack Overflow использует истечение срока действия ApplicationCache для запуска фонового кода через определенные промежутки времени.
Если вы используете хост Linux, вы почти наверняка будете использовать cron.
В Linux вы можете использовать задания cron (http://www.unixgeeks.org/security/newbie/unix/cron-1.html), чтобы планировать задачи.
Используйте сборщики URL-адресов, такие как wget или curl, для выполнения HTTP-запросов GET.
Защитите свои URL-адреса с помощью аутентификации, чтобы никто не мог выполнять задачи, не зная пользователя/пароля.
Я думаю, что встроенный планировщик заданий Windows является рекомендуемым инструментом для этой работы. Это требует внешнего приложения.
Это может быть или не быть тем, что вы ищете, но прочитайте эту статью "Моделирование служба Windows, использующая ASP.NET для запуска запланированных заданий". Я думаю, что StackOverflow может использовать этот метод, или, по крайней мере, об этом говорили.
Там, где я работаю, мы использовали очень простой метод:
- Настройте веб-сервис/веб-метод, который выполняет задачу. При желании этот веб-сервис можно защитить с помощью имени пользователя/пароля.
- Создайте консольное приложение, которое вызывает эту веб-службу. При желании вы можете заставить консольное приложение отправлять параметры и/или возвращать какие-то метрики для вывода на консоль или во внешнее ведение журнала.
- Запланируйте этот исполняемый файл в выбранном планировщике задач.
Это некрасиво, зато просто и надежно. Поскольку консольное приложение — это, по сути, всего лишь пульс, чтобы сказать приложению, чтобы оно выполняло свою работу, ему не нужно совместно использовать какие-либо библиотеки с приложением. Еще один плюс этой методологии заключается в том, что ее довольно просто запустить вручную, когда это необходимо.
Используйте сборщики URL-адресов, такие как wget или curl, для выполнения HTTP-запросов GET.
Защитите свои URL-адреса с помощью аутентификации, чтобы никто не мог выполнять задачи, не зная пользователя/пароля.
Вы также можете указать cron, например, запускать php-скрипты напрямую. И вы можете установить разрешения для файла PHP, чтобы другие люди не могли получить к ним доступ, или, что еще лучше, не размещайте эти служебные сценарии в доступном через Интернет каталоге...
Java и Spring — используйте кварц. Очень красиво и надежно -- http://static.springframework.org/spring/docs/1.2.x/reference/scheduling.html
Я думаю, что есть более простые способы, чем использование cron (Linux) или планировщика заданий (Windows). Вы можете встроить это в свое веб-приложение, используя: (a) кварцевый планировщик,
или если вы не хотите интегрировать другую стороннюю библиотеку в свое приложение: (b) создайте поток при запуске, который использует стандартный класс Java 'java.util.Timer' для выполнения ваших задач.