/// <summary>
 ///     Constructs instance
 /// </summary>
 public LinkDeserializationException(ILinkConsumedMessage <byte[]> rawMessage, Type targetBodyType,
                                     Exception innerException)
     : base("Cannot deserialize message, see InnerException for details", innerException)
 {
     RawMessage     = rawMessage ?? throw new ArgumentNullException(nameof(rawMessage));
     TargetBodyType = targetBodyType;
 }
Exemple #2
0
 private Task <LinkConsumerAckStrategy> Handle(ILinkConsumedMessage <byte[]> message)
 {
     if (_subscribers.TryGetValue(message.Properties.CorrelationId, out var source))
     {
         source.TrySetResult(message);
         return(Task.FromResult(LinkConsumerAckStrategy.Ack));
     }
     return(Task.FromResult(LinkConsumerAckStrategy.Nack));
 }
Exemple #3
0
        public LinkPulledMessage(
            ILinkConsumedMessage <TBody> message,
            TaskCompletionSource <LinkConsumerAckStrategy> completion
            ) : base(
                message.Body,
                message.Properties,
                message.ReceiveProperties,
                message.Cancellation
                )
        {
            if (completion == null)
            {
                throw new ArgumentNullException(nameof(completion));
            }

            Ack       = CreateActionDelegate(completion, LinkConsumerAckStrategy.Ack);
            Nack      = CreateActionDelegate(completion, LinkConsumerAckStrategy.Nack);
            Requeue   = CreateActionDelegate(completion, LinkConsumerAckStrategy.Requeue);
            Exception = CreateExceptionDelegate(completion);
        }
Exemple #4
0
        public Task <LinkConsumerAckStrategy> PutAsync(ILinkConsumedMessage <byte[]> message)
        {
            var completion = new TaskCompletionSource <LinkConsumerAckStrategy>();
            var msg        = new LinkPulledMessage <byte[]>(message, completion);

            if (msg.Cancellation.IsCancellationRequested || _disposedCancellation.IsCancellationRequested)
            {
                return(Task.FromCanceled <LinkConsumerAckStrategy>(msg.Cancellation));
            }

            try
            {
                using (var compositeCancellation = CancellationTokenSource
                                                   .CreateLinkedTokenSource(_disposedCancellation, msg.Cancellation))
                {
                    LinkedListNode <QueueItem> node;
                    var qitem = new QueueItem(msg, completion);

                    using (_sync.Lock(compositeCancellation.Token))
                    {
                        node = _queue.AddLast(qitem);
                    }

                    qitem.EnableCancellation(() =>
                    {
                        using (_sync.Lock(CancellationToken.None))
                        {
                            node.List?.Remove(node);
                        }
                    });
                }
            }
            catch (OperationCanceledException)
            {
                return(Task.FromCanceled <LinkConsumerAckStrategy>(msg.Cancellation));
            }

            _readSem.Release();
            return(completion.Task);
        }
Exemple #5
0
 private Task <LinkConsumerAckStrategy> OnMessageReceived(ILinkConsumedMessage <byte[]> message)
 => _queue.PutAsync(message);