Пример #1
0
        public Task <ISinkResult <T> > ProcessAsync(T t, CancellationToken ct)
        {
            this.Processed.Add(t);
            ISinkResult <T> result = new SinkResult <T>(new[] { t });

            return(Task.FromResult(result));
        }
Пример #2
0
        public Task <ISinkResult <T> > ProcessAsync(ICollection <T> ts, CancellationToken ct)
        {
            foreach (T t in ts)
            {
                this.Processed.Add(t);
            }
            ISinkResult <T> result = new SinkResult <T>(ts);

            return(Task.FromResult(result));
        }
Пример #3
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                foreach (IMessage message in messages)
                {
                    this.endpoint.Processed.Add(message);
                }
                ISinkResult <IMessage> result = new SinkResult <IMessage>(messages);

                return(Task.FromResult(result));
            }
Пример #4
0
        public void TestConstructor()
        {
            var result1 = new SinkResult <int>(new[] { 1 }, new[] { 2 }, null);

            Assert.Equal(new[] { 1 }, result1.Succeeded);
            Assert.Equal(new[] { 2 }, result1.Failed);
            Assert.Equal(Option.None <SendFailureDetails>(), result1.SendFailureDetails);

            var result2 = new SinkResult <int>(new[] { 3 }, new[] { 4 }, new SendFailureDetails(FailureKind.InternalError, new ArgumentNullException()));

            Assert.Equal(new[] { 3 }, result2.Succeeded);
            Assert.Equal(new[] { 4 }, result2.Failed);
            Assert.True(result2.SendFailureDetails.HasValue);
            result2.SendFailureDetails.ForEach(ex => Assert.IsType <ArgumentNullException>(ex.RawException));
        }
Пример #5
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                Console.ForegroundColor = this.endpoint.color;
                foreach (IMessage message in messages)
                {
                    if (this.count % 10000 == 0)
                    {
                        Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "({0}) {1}: {2}", this.count, this.endpoint, message));
                    }
                    this.count++;
                }
                Console.ResetColor();
                ISinkResult <IMessage> result = new SinkResult <IMessage>(messages);

                return(Task.FromResult(result));
            }
Пример #6
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                ISinkResult <IMessage> result;

                if (messages.Count <= 1)
                {
                    // Only fail if we have more than one message
                    result = new SinkResult <IMessage>(messages);
                }
                else
                {
                    IMessage[] successful = messages.Take(messages.Count / 2).ToArray();
                    IMessage[] failed     = messages.Skip(messages.Count / 2).ToArray();
                    result = new SinkResult <IMessage>(successful, failed, new SendFailureDetails(FailureKind.InternalError, this.endpoint.Exception));
                }
                return(Task.FromResult(result));
            }
Пример #7
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                ISinkResult <IMessage> result;

                if (this.endpoint.Failing)
                {
                    result = new SinkResult <IMessage>(new IMessage[0], messages, new SendFailureDetails(FailureKind.InternalError, this.endpoint.Exception));
                }
                else
                {
                    foreach (IMessage message in messages)
                    {
                        this.endpoint.Processed.Add(message);
                    }

                    result = new SinkResult <IMessage>(messages);
                }
                return(Task.FromResult(result));
            }
Пример #8
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                ISinkResult <IMessage> result;

                if (this.endpoint.CanProcess)
                {
                    foreach (IMessage message in messages)
                    {
                        this.endpoint.Processed.Add(message);
                    }

                    result = new SinkResult <IMessage>(messages);
                }
                else
                {
                    // Simulate connectivity failure and don't process any messages
                    result = new SinkResult <IMessage>(new IMessage[0], messages, new SendFailureDetails(FailureKind.InternalError, new Exception("endpoint failed")));
                }

                return(Task.FromResult(result));
            }
Пример #9
0
        public async Task <ISinkResult <T> > ProcessAsync(ICollection <T> ts, CancellationToken token)
        {
            var             succeeded = new List <T>();
            var             failed    = new List <T>();
            var             invalid   = new List <InvalidDetails <T> >();
            ICollection <T> messages  = ts;
            ISinkResult <T> rv;

            ShouldRetry shouldRetry = this.retryPolicy.RetryStrategy.GetShouldRetry();

            try
            {
                int i = 0;
                SendFailureDetails failureDetails = null;
                bool finished = false;
                while (!finished)
                {
                    token.ThrowIfCancellationRequested();

                    ISinkResult <T> result = await this.underlying.ProcessAsync(messages, token);

                    succeeded.AddRange(result.Succeeded);
                    invalid.AddRange(result.InvalidDetailsList);

                    if (result.IsSuccessful)
                    {
                        failureDetails = null;
                        finished       = true;
                    }
                    else
                    {
                        TimeSpan retryAfter;
                        failureDetails = result.SendFailureDetails.OrDefault();
                        if (failureDetails != null && this.retryPolicy.ErrorDetectionStrategy.IsTransient(failureDetails.RawException) && shouldRetry(i, failureDetails.RawException, out retryAfter))
                        {
                            // if we should retry, set the next group of messages to send
                            // to the failed messages from the previous attempt
                            messages = result.Failed;

                            Preconditions.CheckRange(retryAfter.TotalMilliseconds, 0.0);
                            await Task.Delay(retryAfter, token);

                            i++;
                        }
                        else
                        {
                            // do not retry, return failed messages as failed
                            failed.AddRange(result.Failed);
                            finished = true;
                        }
                    }
                }
                rv = new SinkResult <T>(succeeded, failed, invalid, failureDetails);
            }
            catch (OperationCanceledException ex)
            {
                failed.AddRange(messages);
                rv = new SinkResult <T>(succeeded, failed, invalid, new SendFailureDetails(FailureKind.InternalError, ex));
            }
            catch (Exception ex)
            {
                failed.AddRange(messages);
                rv = new SinkResult <T>(succeeded, failed, invalid, new SendFailureDetails(FailureKind.InternalError, ex));
            }
            return(rv);
        }
Пример #10
0
        public Task <ISinkResult <T> > ProcessAsync(ICollection <T> ts, CancellationToken token)
        {
            ISinkResult <T> result = new SinkResult <T>(Empty, ts, new SendFailureDetails(FailureKind.InternalError, this.Exception));

            return(Task.FromResult(result));
        }
Пример #11
0
        public Task <ISinkResult <T> > ProcessAsync(ICollection <T> ts, CancellationToken token)
        {
            ISinkResult <T> result = new SinkResult <T>(ts);

            return(Task.FromResult(result));
        }
Пример #12
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                ISinkResult <IMessage> result = new SinkResult <IMessage>(messages);

                return(Task.FromResult(result));
            }
Пример #13
0
            public Task <ISinkResult <IMessage> > ProcessAsync(ICollection <IMessage> messages, CancellationToken token)
            {
                ISinkResult <IMessage> result = new SinkResult <IMessage>(new IMessage[0], messages, new SendFailureDetails(FailureKind.InternalError, this.endpoint.Exception));

                return(Task.FromResult(result));
            }