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

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

Однако я заметил, что пару месяцев назад он начал обрабатывать два файла одновременно, что вызывает проблемы.

Хотя я мог бы реорганизовать код, чтобы учесть это, у меня действительно нет времени, и отдача будет минимальной. Я просто хочу, чтобы он снова обрабатывал один элемент за раз, но я не могу найти ничего, что могло бы заставить это измениться. Есть ли какие-либо настройки на лазурном портале, о которых мне следует знать? Я не верю, что какой-либо код, относящийся к самому триггеру, изменился.

Заранее спасибо

0
user9156583 30 Дек 2017 в 20:37

2 ответа

Лучший ответ

Конечно, это можно сделать. Обратите внимание, что веб-задание может быть инициировано как очередью служебной шины, так и очередью хранилища Azure. Вот информация для обоих.

Для очередей хранилища Azure

По умолчанию QueueTrigger захватывает 16 сообщений за раз и обрабатывает их параллельно. Если вы этого не хотите, вам необходимо установить для свойства BatchSize экземпляра JobHostConfiguration значение 1 в статическом методе void Main вашего WebJob. Пример:

 static void Main(string[] args)
 {
     JobHostConfiguration config = new JobHostConfiguration();
     config.Queues.BatchSize = 8;
     JobHost host = new JobHost(config);
     host.RunAndBlock();
 }

Для очередей служебной шины

Точно так же вы установите свойства в JobHostConfiguration. Если вы используете служебную шину, вам потребуется немного больше настроек. Пример:

static void Main(string[] args)
{    
    JobHostConfiguration config = new JobHostConfiguration();
    ServiceBusConfiguration serviceBusConfig = new ServiceBusConfiguration();
    serviceBusConfig.MessageOptions.MaxConcurrentCalls = 1;
    config.UseServiceBus(serviceBusConfig);

    JobHost host = new JobHost(config);
    host.RunAndBlock();
}
0
Rob Reagan 30 Дек 2017 в 17:54

В моем случае проблема заключалась в том, что кто-то увеличил масштаб службы приложений Azure до двух экземпляров. Однако я считаю ответ Роба наиболее полезным.

0
user9156583 5 Янв 2018 в 10:46