/// <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; }
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)); }
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); }
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); }
private Task <LinkConsumerAckStrategy> OnMessageReceived(ILinkConsumedMessage <byte[]> message) => _queue.PutAsync(message);