1

I azur webjob Setup nächsten Code verwendet haben:Azure sdk ServiceBusTrigger löst Verarbeitung der gleichen Nachricht jede Minute

Program.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]; 
     } 
    } 
} 

Functions.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. Konfigurationsabschnitt für Konfigurationsdatei-Warteschlangenname:

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

ProcessingInfo Klasse:

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

Das Problem dabei ist, dass für die gleiche Nachricht von webjob-test Warteschlange ProcessQueueMessage wird jede Minute nach dem ersten Auftreten ausgelöst. Laut Antwort here sollte dies einfach mit OnMessageOptions.AutoRenewTimeout konfiguriert werden, aber es scheint nicht zu funktionieren. Kann jemand bitte mit diesem Problem helfen?

+0

Die [Dokumentation] (https://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.aspx), spricht über die 60 Sekunden Timeout und beschreibt, wie Sie es erhöhen können. Dies ist für die OnMessageOptions-Klasse, aber ich kann nicht sehen, wie es sich auf WebJobs bezieht. – lxalln

+0

@Vova. Nach dem Konfigurieren der Zeitüberschreitung löst es immer noch die gleiche Nachricht aus. Der einzige Grund, an den ich denken kann, ist, dass die Verarbeitungsfunktion mehr Zeit benötigt als das Timeout, aufgrund dessen das SDK annimmt, dass die Nachricht noch nicht verarbeitet wurde und sie daher wieder in die Warteschlange aufnimmt. Ist es möglich, die Verarbeitung zu einem Hintergrundthread zu verschieben? – Sandesh

Antwort

0

Wenn Sie auf die Nachricht sagen, dass complated, wird dann nicht in der Warteschlange wieder Beispiel

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); 
} 

Überprüfen Sie die link für weitere Informationen

0

Dies könnte passieren, wenn die Nachricht poisonuouse ist und dann löscht das WebJob SDK es nicht.

Nachrichten, deren Inhalt zum Fehlschlagen einer Funktion führt, werden als Nachrichten bezeichnet. Wenn die Funktion fehlschlägt, wird die Warteschlangennachricht nicht gelöscht und schließlich wird wieder aufgenommen, wodurch der Zyklus wiederholt wird. Das SDK kann automatisch den Zyklus nach einer begrenzten Anzahl von Iterationen unterbrechen, oder Sie können es manuell tun.

See: 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