Example #1
0
        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);
            }
        }