public async Task OnDelivery(RabbitMQDelivery delivery)
        {
            var correlationId = delivery.CorrelationId;

            if (correlationId == null || !contexts.TryRemove(correlationId, out var context))
            {
                await delivery.TryReject();

                return;
            }

            context.SetResult(delivery);
        }
        public async Task Handle(RabbitMQChannel channel, BasicDeliverEventArgs source)
        {
            asyncContextAccessor.Set(channel);

            var delivery = new RabbitMQDelivery(channel.Model, acknowledgeMode, source);

            if (acknowledgeMode == AcknowledgeMode.BeforeHandling)
            {
                await delivery.TryAcknowledge();
            }

            try
            {
                await handler.Handle(delivery);
            }
            catch (Exception ex)
            {
                await delivery.SetException(ex);
            }

            if (delivery.Exceptions.Any())
            {
                switch (exceptionMode)
                {
                case ExceptionMode.Hold:
                    return;

                case ExceptionMode.Reject:
                    await delivery.TryReject();

                    return;

                case ExceptionMode.Unacknowledge:
                    await delivery.TryUnacknowledge();

                    return;

                default:     // Ignore
                    break;
                }
            }

            if (acknowledgeMode == AcknowledgeMode.AfterHandling)
            {
                await delivery.TryAcknowledge();
            }
        }
 public void SetResult(RabbitMQDelivery result)
 => taskSource.SetResult(result);