예제 #1
0
 public Batch(DateTime firstMessageReceived, DateTime lastMessageReceived, BatchCompletionMode mode, ConsumeContext <TMessage>[] messages)
 {
     FirstMessageReceived = firstMessageReceived;
     LastMessageReceived  = lastMessageReceived;
     Mode      = mode;
     _messages = messages;
 }
예제 #2
0
        async Task Deliver(ConsumeContext context, IReadOnlyList <ConsumeContext <TMessage> > messages, BatchCompletionMode batchCompletionMode)
        {
            _timer.Dispose();

            Batch <TMessage> batch = new Batch(_firstMessage, _lastMessage, batchCompletionMode, messages);

            ConsumeContext <Batch <TMessage> > batchConsumeContext = new BatchConsumeContext <TMessage>(context, batch);

            try
            {
                await _consumerPipe.Send(batchConsumeContext).ConfigureAwait(false);

                _completed.TrySetResult(DateTime.UtcNow);
            }
            catch (OperationCanceledException exception) when(exception.CancellationToken == context.CancellationToken)
            {
                _completed.TrySetCanceled();
            }
            catch (Exception exception)
            {
                if (batchConsumeContext.TryGetPayload(out RetryContext <ConsumeContext <Batch <TMessage> > > retryContext))
                {
                    for (var i = 0; i < messages.Count; i++)
                    {
                        messages[i].GetOrAddPayload(() => retryContext);
                    }
                }

                _completed.TrySetException(exception);
            }
        }
예제 #3
0
        async Task Deliver(ConsumeContext context, IReadOnlyList <ConsumeContext <TMessage> > messages, BatchCompletionMode batchCompletionMode)
        {
            _timer.Dispose();

            Batch <TMessage> batch = new Batch(_firstMessage, _lastMessage, batchCompletionMode, messages);

            try
            {
                var proxy = new MessageConsumeContext <Batch <TMessage> >(context, batch);

                await _consumerFactory.Send(proxy, _consumerPipe).ConfigureAwait(false);

                _completed.TrySetResult(DateTime.UtcNow);
            }
            catch (OperationCanceledException exception) when(exception.CancellationToken == context.CancellationToken)
            {
                _completed.TrySetCanceled();
            }
            catch (Exception exception)
            {
                _completed.TrySetException(exception);
            }
        }