2014-09-12 2 views
3

Меня интересует использование WebJob для замены существующего консольного приложения. Консольное приложение принимает 1 из 5 параметров, используя синтаксис стиля/аргумента, который я сейчас запускаю с помощью Планировщика Windows на моей виртуальной машине. Каждое расписание запускает приложение с определенным аргументом. Некоторые задания выполняются каждые 5 минут, другие - каждые 6 часов.Преобразование консольного приложения в Azure webjobs

Когда я загружаю ZIP-архив, содержащий мое консольное приложение и его зависимости, я ожидал, что сможет предоставить аргумент командной строки для приложения. Это, похоже, не так.

Например, если я создаю пакетный файл (например, Send-Emails.bat), а затем создаю новый WebJob, называемый Send-Emails, он запускает командный файл. Это нормально, но это будет означать, что мне нужно создать 5 разных WebJob (опять же, не проблема) и загрузить ZIP 5 раз, каждый из которых имеет отдельный командный файл, который вызывает консоль с аргументом.

Этот последний шаг кажется очень неэффективным и быстро станет кошмаром для обслуживания. Развертывание такой системы также создало бы проблемы.

Это похоже на базовый сценарий, и я предполагаю, что команда Azure разработала WebJobs. Кто-нибудь имел успех в этом? Я бы предпочел не изменять свой код, если это вообще возможно, и вызов WebJobs из моего веб-приложения с использованием API, похоже, также не идеален.

ответ

2

Несколько предложений:

  • Вы можете попытаться разделить файлы реализации из экземпляров задания: Can multiple Azure webjobs share the same assemblies?
  • Почему вы не только одну работу, с пакетный файл, вызывающий ваш консольное приложение пять раз с разными аргументами?
  • Автоматизация развертывания: Enable WebJobs deployment for an existing Console Application project
  • Или если вы не хотите связываться с веб-сайтами в Visual Studio, напишите сценарий для обновления заданий по FTPS. Например. с WinSCP: Automating WebJob Update
    (я автор WinSCP)
+1

Спасибо за ваш ответ Мартин. Что касается только одного задания, мои запланированные задачи выполняются с разными интервалами (некоторые работают каждые 5 минут, а другие работают только каждые 6 часов). – Paul

+0

Вы можете сделать запись состояния работоспособной, чтобы помнить, когда в последний раз выполнялись разные задачи. Затем, если вы запускаете задание каждые 5 минут, каждый раз он будет запускать разные задачи. –

1

Хотя это и не идеальное решение, потому что она по-прежнему включает в себя планировщик, решение ниже, имеет несколько преимуществ. Позвольте мне вначале описать, как это работает:

У вас есть один WebJob, который использует SDK WebJobs. Внутри этой работы у вас есть 5 различных функций, по одному для каждого заданного вами задания. Каждая из этих функций прослушивается в другой очереди хранения. Затем у вас есть 5 планировщиков (по одной для каждой функции), которые помещают сообщение в очередь, соответствующую функции, которая должна быть вызвана.

Преимущество этого решения в том, что вы можете изменить расписание функции, не касаясь кода задания, и у вас есть все ваши рабочие места/функции в одном месте.

Вот некоторые примеры кода для webjob:

public static void Main() 
{ 
    using (JobHost host = new JobHost()) 
    { 
     host.RunAndBlock(); 
    } 
} 

public static void SendEmailFunction(
    [QueueTrigger("send-email-function-trigger")] string message, 
    TextWriter log, 
{ 
    log.WriteLine("sending an email"); 
    // Send email 
} 

public static void DoSomethingElse(
    [QueueTrigger("do-something-else-trigger")] string message 
    TextWriter log) 
{ 
    log.WriteLine("Doing something else"); 
} 

// ... more functions ... 

Затем, если у вас есть планировщик SendEmail, который помещает сообщение в «отправить электронную почту-функции-триггер», то SendEmailFunction будет срабатывать.


Другим вариантом является использование некоторых переменных окружения вместо аргументов командной строки.Основываясь на имени задания, вы смотрите в переменной среды для значения аргумента.

Смежные вопросы