Azure SDK ServiceBusTrigger инициирует обработку одного и того же сообщения каждую минуту.

У меня есть настройка лазурного веб-задания, используя следующий код:

Программа.cs:

public class Program {
    static void Main(){
        JobHostConfiguration config = new JobHostConfiguration();
        config.Tracing.ConsoleLevel = TraceLevel.Verbose;
        config.Queues.BatchSize = 1;
        config.UseTimers();
        config.Queues.MaxDequeueCount = 1;
        config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(3);
        ServiceBusConfiguration sbConfig = new ServiceBusConfiguration();
        sbConfig.MessageOptions = new OnMessageOptions
        {
            MaxConcurrentCalls = 5,
            AutoRenewTimeout = TimeSpan.FromMinutes(10),
            AutoComplete = true
        };

        config.UseServiceBus(sbConfig);
        config.NameResolver = new QueueNameResolver();

        var host = new JobHost(config);
        host.RunAndBlock();
    }

    public class QueueNameResolver : INameResolver
    {
        public string Resolve(string name)
        {
            return ConfigurationManager.AppSettings[name];
        }
    }
}

Функции.cs

public static void ProcessQueueMessage([ServiceBusTrigger("%WebjobIncomingQueueName%")] ProcessingInfo processingInfo, TextWriter webjobTextWriter){
    webjobTextWriter.WriteLine("Service Bus trigger started");
    //long running task simulation
    Thread.Sleep(400000);
}

Раздел конфигурации имени очереди файла App.config:

<appSettings>
    <add key="WebjobIncomingQueueName" value="webjob-test" />
</appSettings>

Класс ProcessingInfo:

 public class ProcessingInfo {
        public long ID { get; set; }
 }

Проблема здесь в том, что для одного и того же сообщения из webjob-test очереди ProcessQueueMessage запускается каждую минуту после первого появления. Согласно ответу здесь это должно быть легко настроено с помощью OnMessageOptions.AutoRenewTimeout, однако, похоже, это не работает. Может ли кто-нибудь помочь с этой проблемой?


person Volodymyr    schedule 27.04.2016    source источник
comment
В документации говорится о 60-секундном timeout и описывает, как его увеличить. Это для класса OnMessageOptions, но я не понимаю, как это связано с веб-заданиями.   -  person lxalln    schedule 28.04.2016
comment
@Вова. После настройки тайм-аута он по-прежнему вызывает одно и то же сообщение каждую минуту? Единственная причина, о которой я могу думать, заключается в том, что функция обработки занимает больше времени, чем тайм-аут, из-за которого SDK предполагает, что сообщение еще не обработано, и, следовательно, добавляет его обратно в очередь. Можно ли перенести обработку в фоновый поток?   -  person Sandesh    schedule 13.05.2016


Ответы (2)


Когда вы говорите, что сообщение компилируется, оно не будет снова стоять в очереди Пример

while ((message = myQueueClient.Receive(new TimeSpan(hours: 0, minutes: 0, seconds: 5))) != null)
{
    Console.WriteLine(string.Format("Message received: {0}, {1}, {2}", message.SequenceNumber, message.Label, message.MessageId));
    message.Complete();

    Console.WriteLine("Processing message (sleeping...)");
    Thread.Sleep(1000);
}

Перейдите по ссылке для получения дополнительной информации.

person Lyubomir Velchev    schedule 22.08.2016

Это может произойти, если сообщение является опасным, а пакет SDK для веб-заданий не удаляет его.

Сообщения, содержимое которых приводит к сбою функции, называются подозрительными сообщениями. Когда функция дает сбой, сообщение из очереди не удаляется и, в конце концов, подхватывается снова, что приводит к повторению цикла. SDK может автоматически прерывать цикл после ограниченного количества итераций, либо вы можете сделать это вручную.

См.: https://docs.microsoft.com/en-us/azure/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to#a-idpoisona-how.-to-handle-poison-messages

person Ravit D    schedule 25.12.2016