public Task PublishAsync( ILinkPublishMessage <byte[]> message, CancellationToken?cancellation = null ) { if (State == LinkProducerState.Disposed) { throw new ObjectDisposedException(GetType().Name); } if (message == null) { throw new ArgumentNullException(nameof(message)); } if (message.PublishProperties.Mandatory == true && !ConfirmsMode) { throw new LinkNotSupportedException("Mandatory without ConfirmsMode not supported"); } if (cancellation == null) { if (_configuration.PublishTimeout != TimeSpan.Zero && _configuration.PublishTimeout != Timeout.InfiniteTimeSpan) { cancellation = new CancellationTokenSource(_configuration.PublishTimeout).Token; } else { cancellation = CancellationToken.None; } } var msgProperties = _configuration.MessageProperties.Extend(message.Properties); msgProperties.AppId = _appId; var publishProperties = _configuration.PublishProperties.Extend(message.PublishProperties); var body = message.Body; _configuration.MessageIdGenerator.SetMessageId( body, msgProperties, publishProperties.Clone() ); var msg = new LinkProducerMessage(body, msgProperties, publishProperties, cancellation.Value); try { _messageQueue.Put(msg); } catch { throw new ObjectDisposedException(GetType().Name); } return(msg.Completion); }
public Item(LinkProducerMessage message, ulong seq, string correlationId) { Message = message ?? throw new ArgumentNullException(nameof(message)); Seq = seq; if (string.IsNullOrWhiteSpace(correlationId)) { throw new ArgumentNullException(nameof(correlationId)); } CorrelationId = correlationId; }
public string Add(LinkProducerMessage message, ulong seq) { if (message == null) { throw new ArgumentNullException(nameof(message)); } lock (_sync) { if (seq < _minSeq) { throw new ArgumentException("Seq less than minimum seq, do you forget to reset queue?", nameof(seq)); } if (_seqItems.ContainsKey(seq)) { throw new ArgumentException("Queue already contains message with specified seq", nameof(seq)); } var correlationId = Guid.NewGuid().ToString("D"); while (_correlationItems.ContainsKey(correlationId)) { correlationId = Guid.NewGuid().ToString("D"); } var item = new Item(message, seq, correlationId); _seqItems[item.Seq] = item; _correlationItems[item.CorrelationId] = item; if (_minSeq > item.Seq) { _minSeq = item.Seq; } return(item.CorrelationId); } }