Приложение использует .NET 4.6.1 и пакет nuget Microsoft.Azure.ServiceBus.EventProcessorHost v2.0.2 вместе с зависимостью пакета WindowsAzure.ServiceBus v3.0.1 для обработки сообщений концентратора событий Azure.
Приложение имеет реализацию IEventProcessor
. Когда необработанное исключение EventProcessorHost
из метода ProcessEventsAsync
EventProcessorHost
никогда не отправляет эти сообщения повторно в работающий экземпляр IEventProcessor
. (Анекдотически, он будет повторно отправлять, если приложение хостинга остановлено и перезапущено или если аренда потеряна и повторно получена.)
Есть ли способ заставить сообщение события, в результате которого EventProcessorHost
повторно отправить EventProcessorHost
в реализацию IEventProcessor
?
В этом комментарии представлено одно возможное решение почти идентичного вопроса: пересылать необработанные сообщения EventHub в IEventProcessor.ProcessEventsAsync
В комментарии предлагается хранить копию последнего успешно обработанного сообщения о событии и явно указывать контрольные точки, используя это сообщение, когда возникает исключение в ProcessEventsAsync
. Однако после реализации и тестирования такого решения EventProcessorHost
прежнему не отправляет повторно. Реализация довольно проста:
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);
}
}
Частичный образец журнала доступен здесь: https://gist.github.com/ttbjj/4781aa992941e00e4e15e0bf1c45f316#file-gistfile1-txt