L'application utilise .NET 4.6.1 et le Microsoft.Azure.ServiceBus.EventProcessorHost nuget package v2.0.2, ainsi que la dépendance WindowsAzure.ServiceBus paquet v3.0.1 pour le processus d'Azur Event Hub messages.
L'application dispose d'une mise en œuvre de l' IEventProcessor
. Lorsqu'une exception non gérée s'est jetée de la ProcessEventsAsync
méthode de l' EventProcessorHost
jamais re-envoie ces messages à l'instance en cours d' IEventProcessor
. (Pour l'anecdote, il sera ré-envoyer si l'application d'hébergement est arrêté et redémarré ou si le bail est perdu et ré-obtenu.)
Est-il un moyen pour forcer le message d'événement qui a entraîné une exception à être ré-envoyé par EventProcessorHost
de la IEventProcessor
mise en œuvre?
Une solution possible est présentée dans le présent commentaire sur une presque identique à la question: Remettre non transformés EventHub messages dans IEventProcessor.ProcessEventsAsync
Le commentaire suggère la tenue d'une copie du dernier traité avec succès des messages d'événement et la vérification explicitement à l'aide de ce message lorsqu'une exception se produit en ProcessEventsAsync
. Cependant, après la mise en œuvre et de tester une telle solution, l' EventProcessorHost
n'est toujours pas ré-envoyer. La mise en œuvre est assez simple:
private EventData _lastSuccessfulEvent;
public async Task ProcessEventsAsync(
PartitionContext context,
IEnumerable<EventData> messages)
{
try
{
await ProcessEvents(context, messages); // does actual processing, may throw exception
_lastSuccessfulEvent = messages
.OrderByDescending(ed => ed.SequenceNumber)
.First();
}
catch(Exception ex)
{
await context.CheckpointAsync(_lastSuccessfulEvent);
}
}
Une analyse de choses en action:
Partielle d'un journal de l'échantillon est disponible ici: https://gist.github.com/ttbjj/4781aa992941e00e4e15e0bf1c45f316#file-gistfile1-txt