예제 #1
0
        async Task ProcessRequest(IBulkRetryRequest request)
        {
            var batchesWithLastAttempt = await GetRequestedBatches(request).ConfigureAwait(false);

            var batches       = batchesWithLastAttempt.Item1;
            var latestAttempt = batchesWithLastAttempt.Item2;
            var totalMessages = batches.Sum(b => b.Length);

            if (!OperationManager.IsOperationInProgressFor(request.RequestId, request.RetryType) && totalMessages > 0)
            {
                var numberOfMessagesAdded = 0;

                await OperationManager.Prepairing(request.RequestId, request.RetryType, totalMessages)
                .ConfigureAwait(false);

                for (var i = 0; i < batches.Count; i++)
                {
                    await StageRetryByUniqueMessageIds(request.RequestId, request.RetryType, batches[i], request.StartTime, latestAttempt, request.Originator, GetBatchName(i + 1, batches.Count, request.Originator), request.Classifier)
                    .ConfigureAwait(false);

                    numberOfMessagesAdded += batches[i].Length;

                    await OperationManager.PreparedBatch(request.RequestId, request.RetryType, numberOfMessagesAdded)
                    .ConfigureAwait(false);
                }
            }
        }
예제 #2
0
        void ProcessRequest(IBulkRetryRequest request)
        {
            DateTime latestAttempt;
            var      batches       = GetRequestedBatches(request, out latestAttempt);
            var      totalMessages = batches.Sum(b => b.Length);

            if (!RetryOperationManager.IsOperationInProgressFor(request.RequestId, request.RetryType) && totalMessages > 0)
            {
                var numberOfMessagesAdded = 0;

                RetryOperationManager.Prepairing(request.RequestId, request.RetryType, totalMessages);

                for (var i = 0; i < batches.Count; i++)
                {
                    StageRetryByUniqueMessageIds(request.RequestId, request.RetryType, batches[i], request.StartTime, latestAttempt, request.Originator, GetBatchName(i + 1, batches.Count, request.Originator), request.Classifier);
                    numberOfMessagesAdded += batches[i].Length;

                    RetryOperationManager.PreparedBatch(request.RequestId, request.RetryType, numberOfMessagesAdded);
                }
            }
        }
예제 #3
0
        IList <string[]> GetRequestedBatches(IBulkRetryRequest request, out DateTime latestAttempt)
        {
            var response     = new List <string[]>();
            var currentBatch = new List <string>(BatchSize);

            latestAttempt = DateTime.MinValue;

            using (var session = store.OpenSession())
                using (var stream = request.GetDocuments(session))
                {
                    while (stream.MoveNext())
                    {
                        var current = stream.Current.Document;
                        currentBatch.Add(current.UniqueMessageId);

                        if (currentBatch.Count == BatchSize)
                        {
                            response.Add(currentBatch.ToArray());

                            currentBatch.Clear();
                        }

                        var lastDocumentAttempt = current.ProcessingAttempts.Select(x => x.FailureDetails.TimeOfFailure).Max();
                        if (lastDocumentAttempt > latestAttempt)
                        {
                            latestAttempt = lastDocumentAttempt;
                        }
                    }

                    if (currentBatch.Any())
                    {
                        response.Add(currentBatch.ToArray());
                    }
                }

            return(response);
        }
예제 #4
0
        async Task <Tuple <List <string[]>, DateTime> > GetRequestedBatches(IBulkRetryRequest request)
        {
            var response      = new List <string[]>();
            var currentBatch  = new List <string>(BatchSize);
            var latestAttempt = DateTime.MinValue;

            using (var session = store.OpenAsyncSession())
                using (var stream = await request.GetDocuments(session).ConfigureAwait(false))
                {
                    while (await stream.MoveNextAsync().ConfigureAwait(false))
                    {
                        var current = stream.Current.Document;
                        currentBatch.Add(current.UniqueMessageId);

                        if (currentBatch.Count == BatchSize)
                        {
                            response.Add(currentBatch.ToArray());

                            currentBatch.Clear();
                        }

                        var lastDocumentAttempt = current.ProcessingAttempts.Select(x => x.FailureDetails.TimeOfFailure).Max();
                        if (lastDocumentAttempt > latestAttempt)
                        {
                            latestAttempt = lastDocumentAttempt;
                        }
                    }

                    if (currentBatch.Any())
                    {
                        response.Add(currentBatch.ToArray());
                    }
                }

            return(Tuple.Create(response, latestAttempt));
        }
        async Task <Tuple <List <string[]>, DateTime> > GetRequestedBatches(IBulkRetryRequest request)
        {
            var response      = new List <string[]>();
            var currentBatch  = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            var latestAttempt = DateTime.MinValue;

            using (var session = store.OpenAsyncSession())
                using (var stream = await request.GetDocuments(session).ConfigureAwait(false))
                {
                    while (await stream.MoveNextAsync().ConfigureAwait(false))
                    {
                        var current = stream.Current.Document;
                        currentBatch.Add(current.UniqueMessageId);

                        if (currentBatch.Count == BatchSize)
                        {
                            response.Add(currentBatch.ToArray());

                            currentBatch.Clear();
                        }

                        var lastDocumentAttempt = current.LatestTimeOfFailure;
                        if (lastDocumentAttempt > latestAttempt)
                        {
                            latestAttempt = lastDocumentAttempt;
                        }
                    }

                    if (currentBatch.Count > 0)
                    {
                        response.Add(currentBatch.ToArray());
                    }
                }

            return(Tuple.Create(response, latestAttempt));
        }