public async Task ProcessAsync() { if (!_isInited) { await InitAsync(); } List <string> blobs; if (_allBlobsReprocessingRequired) { _log.WriteInfo("BlobProcessor.ProcessAsync", _instanceTag, $"All blobs will be reprocessed"); blobs = await _blobReader.GetBlobsForConversionAsync(null); _allBlobsReprocessingRequired = false; } else { string lastBlob; if (!string.IsNullOrWhiteSpace(_lastBlob)) { lastBlob = _lastBlob; _lastBlob = null; } else { lastBlob = await _blobSaver.GetLastSavedBlobAsync(); } blobs = await _blobReader.GetBlobsForConversionAsync(lastBlob); } foreach (var blob in blobs) { try { _log.WriteInfo("BlobProcessor.ProcessAsync", _instanceTag, $"Processing {blob}"); _blobSaver.StartBlobProcessing(); _messageConverter.StartBlobProcessing((directory, messages) => _blobSaver.SaveToBlobAsync(messages, directory, blob)); await _blobReader.ReadAndProcessBlobAsync(blob); await _messageConverter.FinishBlobProcessingAsync(); await _blobSaver.FinishBlobProcessingAsync(blob); _log.WriteInfo("BlobProcessor.ProcessAsync", _instanceTag, $"Processed {blob}"); } catch (Exception ex) { _log.WriteError("BlobProcessor.ProcessAsync", string.IsNullOrWhiteSpace(_instanceTag) ? blob : $"{_instanceTag}:{blob}", ex); throw; } } if (blobs.Count > 0) { _log.WriteInfo("BlobProcessor.ProcessAsync", _instanceTag, $"Processed {blobs.Count} blobs"); } }