2014-06-27 5 views
6

Ho la seguente logica in un WebJob che utilizza il nuovo SDK WebJobs 0.3.0-beta. Quando il mio codice non riesce a elaborare il messaggio, il dashboard di Azure mostra un'eccezione aggregata (che ha senso poiché questa è asincrona). TUTTAVIA, non ritenta l'elaborazione del messaggio.WebJobs non riprovare messaggio in coda non riuscito

Il pochissimo documentation che sono stato in grado di trovare indica che il messaggio dovrebbe essere riprovato entro 10 minuti dall'errore. Non è questo il caso del nuovo SDK?

public static Task ProcessMyMessageAsync(
    [QueueTrigger(Config.MY_QUEUE)] string msg, 
    int dequeueCount, 
    CancellationToken cancellationToken) 
{ 
    var processor = Config.Container.GetInstance<IMessageProcessor>(); 
    return processor.HandleJobAsync(msg, dequeueCount, cancellationToken); 
} 

L'eccezione ricevo deriva da un'eccezione SQL Timeout (sua una query db contro SQL Azure nel mio codice):

System.AggregateException: System.AggregateException: One or more errors occurred. 
    ---> System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. 
     ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
     ---> System.ComponentModel.Win32Exception: The wait operation timed out 
+0

Si verifica il guasto durante la fase di legame o all'interno vostra funzione? Puoi dare maggiori dettagli su quale eccezione ottieni? –

+0

@VictorHurdugaci L'eccezione non sembra essere correlata al JobHost o qualcosa del genere. È sicuramente all'interno del mio codice e dal momento che è un Timeout SQL, voglio che il messaggio venga ritentato. – ericb

risposta

0

È necessario impostare MaxDequeueCount.

JobHostConfiguration jobHostConf = new JobHostConfiguration(); 
jobHostConf.Queues.MaxDequeueCount = 10; 
var host = new JobHost(jobHostConf); 
host.RunAndBlock(); 

Questo riproverà 10 volte, prima che i messaggi siano messi in una coda di lettere non funzionanti.

È anche possibile utilizzare un criterio di ripetizione personalizzato nella funzione. Vi suggerisco di guardare al "The Transient Gestione Errori Application Block" https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx

Oppure si potrebbe consentire di tentativi in ​​EF con uno SqlAzureExecutionStrategy https://msdn.microsoft.com/en-us/data/dn456835.aspx