Как сделать непрерывное веб-задание?

Я создаю веб-задание Azure, как показано в следующем сценарии, который извлекает элемент из очереди хранилища Azure, а затем сохраняет его в таблице Azure. Процесс завершается в течение 1-2 секунд, но запускается всего несколько раз в минуту (и иногда останавливается примерно через 10 минут). В целом не работает.

Что мне не хватает? Может быть, я смешиваю работу триггера и непрерывную работу, но мне сложно найти подходящий сэмпл.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("started at {0}", DateTime.Now.ToString("s"));

        // Continuous job should have infinite loop.
        while(true){
            var host = new JobHost();
            host.RunAndBlock();
        }
    }

    public static void ProcessQueueMessage([QueueInput("blogqueue")] string json)
    {
        var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings    ["StorageConnectionString"].ConnectionString);
        var tableClient = storageAccount.CreateCloudTableClient();

        // Store it to Azure Table Storage
        // omitted...

        Console.WriteLine("Received JSON: {0}", json);
    }

person Youngjae    schedule 23.04.2014    source источник


Ответы (3)


Несколько комментариев:

  1. Вам не нужен оператор while(true). RunAndBlock уже имеет внутри цикл while, и он там заблокируется.
  2. Вам не нужно извлекать таблицу вручную. Вы можете выполнить привязку к таблице, как показано в примерах здесь
  3. Вы можете выполнить привязку к учетной записи хранения, вам не нужно вручную читать строку подключения из файла конфигурации и создавать экземпляр.

Вот пример привязки к учетной записи хранения:

public static void ProcessQueueMessage([QueueInput("blogqueue")] string json, CloudStorageAccount) 
{
    ...
}

Это дикая догадка, но из вашего кода кажется, что строка подключения к хранилищу хранится в StorageConnectionString в файле конфигурации. JobHost ожидает, что либо (1) строки подключения для среды выполнения и данные будут храниться в AzureJobsData и AzureJobsRuntime (как описано здесь) или (2) передать строку подключения в качестве параметра конструктору JobHost. Думаю, в этом причина крушения.

person Victor Hurdugaci    schedule 23.04.2014
comment
Спасибо, у меня вопрос, выполняется ли связанный метод (ProcessQueueMessage) в режиме Triggered? Я имею в виду, срабатывает счетчик при поступлении элемента очереди или непрерывно проверять новый элемент по периоду собственного планировщика веб-заданий Azure? Мой обозреватель хранилищ Azure показывает, что количество исключений из очереди увеличивается все больше и больше, но не удаляется из очереди, хотя процесс завершился успешно. Поскольку основной метод и связанный метод не имеют конкретной взаимосвязи, трудно угадать процесс. - person Youngjae; 24.04.2014
comment
Если вы используете указанное выше задание в сценарии RunAndBlock, ваша работа должна быть непрерывной. Это означает, что процесс будет выполняться постоянно и периодически (каждые несколько секунд) опрашивать указанную очередь Azure. - person Victor Hurdugaci; 24.04.2014
comment
Я изменил WebJob на WorkerRole сегодня, потому что WebJob, похоже, имеет низкую частоту выполнения (может быть, около 1-2 секунд?). Я ожидал, что у него высокая частота (около 0 ~ 10 мс). Может ли WebJob работать с частотой 0 ~ 10 мс? - person Youngjae; 24.04.2014
comment
WebJob и WebJobs SDK - это две разные вещи, вам не нужна одна, чтобы другая работала, поэтому, если вы напишете свою работу (в .NET, javascript или что-то еще) для частого выполнения, она будет. - person Amit Apple; 24.04.2014

Просто измените настройки публикации в ProjectName / Properties / webjob-publish-settings.json

"runMode": "OnDemand"  =>  "runMode": "Continuous"
person Tomino    schedule 14.04.2016

Для правильной работы непрерывного веб-задания вам необходимо включить «Всегда включено» на вкладке конфигурации вашего веб-сайта.

Функция «Всегда включен» доступна только для тарифного плана «Базовый / Стандартный». Если она не включена, ваше веб-задание может перестать работать через некоторое время.

person Amit Apple    schedule 23.04.2014
comment
а что, если его развернуть в кубернетах? - person jrivam; 01.12.2018