protected virtual async Task ProcessInitializingHandler(PartitionInitializingEventArgs initArgs) { var partitionId = initArgs.PartitionId; Logger.LogTrace($"Initializing partition {partitionId}"); if (initArgs.CancellationToken.IsCancellationRequested) { // Log the condition where the initialization handler is called, an the PartitionInitializingEventArgs contains a cancellation request. Logger.LogTrace($"PartitionInitializingEventArgs contain a cancellation request {partitionId}"); } try { var checkpoint = await CheckpointClient.GetCheckpointForPartitionAsync(partitionId, initArgs.CancellationToken); initArgs.DefaultStartingPosition = EventPosition.FromEnqueuedTime(checkpoint.LastProcessed); Logger.LogTrace($"Starting to read partition {partitionId} from checkpoint {checkpoint.LastProcessed}"); Logger.LogMetric(EventMetrics.EventHubPartitionInitialized(partitionId), 1); } #pragma warning disable CA1031 catch (Exception ex) #pragma warning restore CA1031 { Logger.LogTrace($"Failed to initialize partition {partitionId} from checkpoint"); EventHubExceptionProcessor.ProcessException(ex, Logger, errorMetricName: EventHubErrorCode.EventHubPartitionInitFailed.ToString()); } }
public async Task RunAsync(EventProcessorClient processor, CancellationToken ct) { EnsureArg.IsNotNull(processor); // Processes two types of events // 1) Event hub events // 2) Maximum wait events. These are generated when we have not received an event hub // event for a certain time period and this event is used to flush events in the current window. async Task ProcessEventHandler(ProcessEventArgs eventArgs) { IEventMessage evt; if (eventArgs.HasEvent) { evt = EventMessageFactory.CreateEvent(eventArgs); } else { evt = new MaximumWaitEvent(eventArgs.Partition.PartitionId, DateTime.UtcNow); } await _eventConsumerService.ConsumeEvent(evt); } // todo: consider retry Task ProcessErrorHandler(ProcessErrorEventArgs eventArgs) { _logger.LogError(eventArgs.Exception); return(Task.CompletedTask); } async Task ProcessInitializingHandler(PartitionInitializingEventArgs initArgs) { var partitionId = initArgs.PartitionId; _logger.LogTrace($"Initializing partition {partitionId}"); try { var checkpoint = await _checkpointClient.GetCheckpointForPartitionAsync(partitionId); initArgs.DefaultStartingPosition = EventPosition.FromEnqueuedTime(checkpoint.LastProcessed); _logger.LogTrace($"Starting to read partition {partitionId} from checkpoint {checkpoint.LastProcessed}"); _logger.LogMetric(EventMetrics.EventHubPartitionInitialized(), 1); } #pragma warning disable CA1031 catch (Exception ex) #pragma warning restore CA1031 { _logger.LogTrace($"Failed to initialize partition {partitionId} from checkpoint"); _logger.LogError(ex); } } processor.ProcessEventAsync += ProcessEventHandler; processor.ProcessErrorAsync += ProcessErrorHandler; processor.PartitionInitializingAsync += ProcessInitializingHandler; try { Console.WriteLine($"Starting event hub processor at {DateTime.UtcNow}"); await processor.StartProcessingAsync(); while (!ct.IsCancellationRequested) { } await processor.StopProcessingAsync(); } finally { processor.ProcessEventAsync -= ProcessEventHandler; processor.ProcessErrorAsync -= ProcessErrorHandler; processor.PartitionInitializingAsync -= ProcessInitializingHandler; } }