async Task InnerProcessMessages() { while (!cancellationTokenSource.IsCancellationRequested) { var filesFound = false; foreach (var filePath in Directory.EnumerateFiles(path, "*.*")) { filesFound = true; var nativeMessageId = Path.GetFileNameWithoutExtension(filePath); var transaction = new DirectoryBasedTransaction(path); transaction.BeginTransaction(filePath); await concurrencyLimiter.WaitAsync(cancellationToken) .ConfigureAwait(false); var task = Task.Run(async() => { try { await ProcessFile(transaction, nativeMessageId) .ConfigureAwait(false); transaction.Complete(); } finally { concurrencyLimiter.Release(); } }, cancellationToken); task.ContinueWith(t => { Task toBeRemoved; runningReceiveTasks.TryRemove(t, out toBeRemoved); }, TaskContinuationOptions.ExecuteSynchronously) .Ignore(); runningReceiveTasks.AddOrUpdate(task, task, (k, v) => task) .Ignore(); } if (!filesFound) { await Task.Delay(10, cancellationToken) .ConfigureAwait(false); } } }
async Task ProcessFile(DirectoryBasedTransaction transaction, string messageId) { try { string[] message = File.ReadAllLines(transaction.FileToProcess); var bodyPath = message.First(); var json = string.Join("", message.Skip(1)); Dictionary <string, string> headers = HeaderSerializer.DeSerialize(json); string ttbrString; if (headers.TryGetValue(Headers.TimeToBeReceived, out ttbrString)) { var ttbr = TimeSpan.Parse(ttbrString); //file.move preserves create time var sentTime = File.GetCreationTimeUtc(transaction.FileToProcess); if (sentTime + ttbr < DateTime.UtcNow) { transaction.Commit(); return; } } var tokenSource = new CancellationTokenSource(); using (var bodyStream = new FileStream(bodyPath, FileMode.Open)) { var context = new ContextBag(); context.Set(transaction); var pushContext = new PushContext(messageId, headers, bodyStream, transaction, tokenSource, context); await pipeline(pushContext) .ConfigureAwait(false); } if (tokenSource.IsCancellationRequested) { transaction.Rollback(); return; } transaction.Commit(); } catch (Exception) { transaction.Rollback(); } }
async Task ProcessFileWithTransaction(string filePath, string messageId) { using (var transaction = new DirectoryBasedTransaction(path)) { transaction.BeginTransaction(filePath); var message = File.ReadAllLines(transaction.FileToProcess); var bodyPath = message.First(); var json = string.Join("", message.Skip(1)); var headers = HeaderSerializer.DeSerialize(json); string ttbrString; if (headers.TryGetValue(Headers.TimeToBeReceived, out ttbrString)) { var ttbr = TimeSpan.Parse(ttbrString); // file.move preserves create time var sentTime = File.GetCreationTimeUtc(transaction.FileToProcess); if (sentTime + ttbr < DateTime.UtcNow) { return; } } var body = File.ReadAllBytes(bodyPath); var transportTransaction = new TransportTransaction(); transportTransaction.Set(transaction); var shouldCommit = await HandleMessageWithRetries(messageId, headers, body, transportTransaction, 1) .ConfigureAwait(false); if (shouldCommit) { transaction.Commit(); } } }
async Task InnerProcessMessages() { while (!cancellationTokenSource.IsCancellationRequested) { bool filesFound = false; foreach (string filePath in Directory.EnumerateFiles(path, "*.*")) { filesFound = true; string nativeMessageId = Path.GetFileNameWithoutExtension(filePath); DirectoryBasedTransaction transaction = new DirectoryBasedTransaction(path); transaction.BeginTransaction(filePath); await concurrencyLimiter.WaitAsync(cancellationToken).ConfigureAwait(false); Task task = Task.Run(async () => { try { await ProcessFile(transaction, nativeMessageId); transaction.Complete(); } finally { concurrencyLimiter.Release(); } }, cancellationToken); task.ContinueWith(t => { Task toBeRemoved; runningReceiveTasks.TryRemove(t, out toBeRemoved); }, TaskContinuationOptions.ExecuteSynchronously) .Ignore(); runningReceiveTasks.AddOrUpdate(task, task, (k, v) => task) .Ignore(); } if (!filesFound) { await Task.Delay(10, cancellationToken); } } }
async Task ProcessFile(DirectoryBasedTransaction transaction, string messageId) { try { string[] message = File.ReadAllLines(transaction.FileToProcess); string bodyPath = message.First(); string json = string.Join("", message.Skip(1)); Dictionary<string, string> headers = HeaderSerializer.DeSerialize(json); string ttbrString; if (headers.TryGetValue(Headers.TimeToBeReceived, out ttbrString)) { TimeSpan ttbr = TimeSpan.Parse(ttbrString); //file.move preserves create time DateTime sentTime = File.GetCreationTimeUtc(transaction.FileToProcess); if (sentTime + ttbr < DateTime.UtcNow) { transaction.Commit(); return; } } CancellationTokenSource tokenSource = new CancellationTokenSource(); using (FileStream bodyStream = new FileStream(bodyPath, FileMode.Open)) { ContextBag context = new ContextBag(); context.Set(transaction); PushContext pushContext = new PushContext(messageId, headers, bodyStream, transaction, tokenSource, context); await pipeline(pushContext).ConfigureAwait(false); } if (tokenSource.IsCancellationRequested) { transaction.Rollback(); return; } transaction.Commit(); } catch (Exception) { transaction.Rollback(); } }