- PVSM.RU - https://www.pvsm.ru -
Не так давно в Microsoft Azure появилась новая фича — WebJob, правда, пока в стадии alpha 2.
Основная идея WebJob — дать возможность запускать в Azure задачи по расписанию. Плюс, для .NET кода предоставляется простой API для event driven обработки.
Если было действие, которое нужно запускать раз в день то раньше это решалось несколько странно для Cloud Platform:
Создать виртуалку, и в Windows Scheduler поставить новую задачу. Этот вариант отлично работает, но в рамках виртуальной машины. Если нужно, например, логи сайта с WebSite Role сжимать и отправлять куда-нибудь, то виртуалка абсолютно бесполезна. Есть конечно и плюс — нет привязки к Azure.
Планировщик Windows Azure Scheduler [1]. Пример по русски [2]. Проблема в том, что для его использования надо написать код, который, в общем-то, лично мне кажется не обязательным: все должно быть проще.
Таким образом, можно запустить .NET код, но что делать, если логика написана на батниках или на powershell?
Ну и самое важное: сервис предполагается использовать для:
Такой набор мне кажется очень ограниченным.
Worker Role, которая в активном режиме будет жить и по заложенному вами алгоритму, выполнять действия. Есть один момент: такой подход совсем не Event Driven. Так, можно запустить .NET код, но что делать, если код опять же на батниках или на powershell? Ну и еще один момент: т.к. Worker Role — это инстанс, за который надо платить, а не отдельно стоящий .exe файл к вашему WebSite Role.
Запуск exe, bat, sh, ps [3]файлов по расписанию или прямо из web-интерфейса.

Для .NET WebJob дополнительно дает API, связывающий ваш код, с внешними источниками событий (очередями, таблицами, блобами). Это Api является не обязательным, но дает плюшку в виде — окна во внешний мир, позволяющее реагировать на события.
Запустить все это можно и локально, без деплоя на Azure, но давайте это сделаем по-честному — загрузим в Azure. Для этого нам понадобится:
WebJob можно разделить на 3 типа:
Я этого делать не буду, об этом более подробно можно прочесть тут [4].
Типичные решения на Windows, как то: Windows service или задача в Windows scheduler имеют одну общую проблему — никогда не знаешь работают они или нет, пока не глянешь на список процессов. Не раз натыкался на ситуацию, когда сервис умирал, но т.к. его через WebUi не видно, то узнаешь о его падении по косвенным признакам (как всегда — логи, крики пользователей, отвалился функционал в UI). Написание WatchDog — это конечно решение, но надо писать код и проверять, что Watchdog сам по себе работает.
Еще одной проблемой является- а запускался ли он по расписанию? Это можно понять из логов, но их же читать надо.
На этом базовая фича- запуск исполняемого файла по расписанию закончена.
Рассмотрим самый тривиальный пример:
Через nuget установлены 2 пакета:
Они за собой еще потянули Newtonsoft.Json и Microsoft.WindowsAzure.ConfigurationManager, но это мелочи.
В методе main создаем объект JobHost и вызываем метод RunAndBlock().
Больше никакой логики при запуске можно не создавать. Как мы видим, из Main никаких других вызовов, кроме RunAndBlock нет.
При загрузке в Azure система сама распознает методы, у которых входные параметры размечены атрибутами типа *Input (например, QueueInput) и вызывает эти методы. Т.е. окно во внешний мир за нас уже прорубили. Наша задача — отработать входное сообщение.
Azure дергает метод, когда в соответствующую очередь/таблицу/блоб добавляется новое значение. Получается такой Event Driven стиль. При этом нам не надо заморачиваться с API чтением объектов из blob, queue, table: за нас инфраструктура WebJob сделает это сама.
Я специально сделал этот пример с одной неточностью, чтобы показать что мы увидим в логах. Выходная строка должна быть out string output – такова специфика.
Чтобы показать, как он работает:
Хорошая статья [5]про Binding (привязка) параметров, где подробно рассказано об Input параметрах.
1. Если у метода есть 2 *Input аргумента, то он будет вызван по добавлению нового объекта в первую очередь/блоб/таблицу, а при добавлении во вторую — нет.
2. Можно использовать не только BlobInput и BlobOutput атрибуты, но и механизм, схожий с routing в mvc/webAPI.
3. Не только Stream или строка.
Ссылка на примеры описанные выше на github [14]. Строки подключения к Storage не действительные, они оставлены как образец, чтобы понять как они выглядят.
P.S. Для тех, кто читает Хансельмана или блог команднды asp.net. Я, по сути, повторил то, что сделали они, но добавил, чем это решение отличается от того, что было ранее.
Автор: SychevIgor
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/58096
Ссылки в тексте:
[1] Windows Azure Scheduler: http://www.Windowsazure.com/en-us/services/scheduler/
[2] Пример по русски : http://habrahabr.ru/post/201840/
[3] ps : http://blogs.msdn.com/b/nicktrog/archive/2014/01/22/running-powershell-web-jobs-on-azure-websites.aspx
[4] тут: http://www.Windowsazure.com/en-us/documentation/articles/web-sites-create-web-jobs/
[5] статья : http://blogs.msdn.com/b/jmstall/archive/2014/01/28/trigger-bindings-and-route-parameters-in-azurejobs.aspx
[6] codeplex : http://aspnet.codeplex.com/SourceControl/latest#Samples/AzureWebJobs/
[7] Собранние : http://curah.microsoft.com/52143/using-the-webjobs-feature-of-Windows-azure-web-sites
[8] Блог : http://www.hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx
[9] msdn : http://blogs.msdn.com/b/webdev/archive/2014/03/27/announcing-0-2-0-alpha2-preview-of-Windows-azure-webjobs-sdk.aspx
[10] ASP.NET : http://www.asp.NET/aspnet/overview/developing-apps-with-Windows-azure/getting-started-with-Windows-azure-webjobs
[11] как хранятся webjob физически. : http://habrahabr.ru/post/212765/
[12] Расширение к студии: http://visualstudiogallery.msdn.microsoft.com/f4824551-2660-4afa-aba1-1fcc1673c3d0
[13] человек сделал систему мониторинга сайта на webjob: http://www.bradygaster.com/post/rebuilding-the-sitemonitr-using-Windows-azure-webjobs
[14] github: https://github.com/SychevIgor/blog_webjob
[15] Источник: http://habrahabr.ru/post/217635/
Нажмите здесь для печати.