예제 #1
0
    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);
            }
        }
    }
예제 #2
0
    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();
        }
    }
예제 #3
0
    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();
        }
    }