Beispiel #1
0
        public void Send(string address, RoutingType?routingType, Message message, CancellationToken cancellationToken)
        {
            CheckAddress(address);
            CheckMessage(message);

            SendInternal(address, routingType, message);
        }
 public void PostSend(string address, RoutingType?routingType, Message message)
 {
     foreach (var sendObserver in _sendObservers)
     {
         sendObserver.PostSend(address, routingType, message);
     }
 }
Beispiel #3
0
        public Task SendAsync(string address, RoutingType?routingType, Message message, Transaction transaction, CancellationToken cancellationToken)
        {
            CheckAddress(address);
            CheckMessage(message);

            return(SendInternalAsync(address, routingType, message, transaction, cancellationToken));
        }
        public void PostSend(string address, RoutingType?routingType, Message message)
        {
            var elapsed    = _metrics.Clock.Nanoseconds - _sendStart.Value;
            var metricTags = GetMetricTags(address, routingType);

            _metrics.Measure.Histogram.Update(_messageSendTime, metricTags, elapsed);
            _metrics.Measure.Meter.Mark(_messageSendRate, metricTags);
        }
        public void Send(string address, RoutingType?routingType, Message message, CancellationToken cancellationToken)
        {
            CheckState();

            _sendObservable.PreSend(address, routingType, message);
            _producer.Send(address, routingType, message, cancellationToken);
            _sendObservable.PostSend(address, routingType, message);
        }
        public async Task SendAsync(string address, RoutingType?routingType, Message message, Transaction transaction, CancellationToken cancellationToken)
        {
            CheckState();

            _sendObservable.PreSend(address, routingType, message);
            await _producer.SendAsync(address, routingType, message, transaction, cancellationToken).ConfigureAwait(false);

            _sendObservable.PostSend(address, routingType, message);
        }
        private static MetricTags GetMetricTags(string address, RoutingType?routingType, string queue = null)
        {
            var metricTags = new MetricTags("Address", address);

            if (routingType != null)
            {
                metricTags = MetricTags.Concat(metricTags, new MetricTags($"{nameof(RoutingType)}", routingType.ToString()));
            }
            if (!string.IsNullOrWhiteSpace(queue))
            {
                metricTags = MetricTags.Concat(metricTags, new MetricTags("Queue", queue));
            }
            return(metricTags);
        }
        private void Send(string address,
                          RoutingType?routingType,
                          Message message,
                          DeliveryState deliveryState,
                          OutcomeCallback callback,
                          object state)
        {
            if (_senderLink.IsDetaching() || _senderLink.IsClosed)
            {
                throw new ProducerClosedException("Producer detached.");
            }

            try
            {
                if (_configuration.SetMessageCreationTime && !message.CreationTime.HasValue)
                {
                    message.CreationTime = DateTime.UtcNow;
                }

                if (message.GetMessageId <object>() == null && _configuration.MessageIdPolicy != null && !(_configuration.MessageIdPolicy is DisableMessageIdPolicy))
                {
                    message.SetMessageId(_configuration.MessageIdPolicy.GetNextMessageId());
                }

                message.Priority ??= _configuration.MessagePriority;
                message.Properties.To = address;
                message.MessageAnnotations[SymbolUtils.RoutingType] ??= routingType.GetRoutingAnnotation();

                _senderLink.Send(message.InnerMessage, deliveryState, callback, state);
                Log.MessageSent(_logger, message);
            }
            catch (AmqpException e) when(IsClosed || IsDetaching)
            {
                throw new ProducerClosedException(e.Error.Description, e.Error.Condition, e);
            }
            catch (AmqpException e)
            {
                throw new MessageSendException(e.Error.Description, e.Error.Condition, e);
            }
            catch (ObjectDisposedException e)
            {
                throw new ProducerClosedException("Producer detached.", e);
            }
            catch (Exception e)
            {
                throw new MessageSendException("Failed to send the message.", e);
            }
        }
        protected async Task SendInternalAsync(string address, RoutingType?routingType, Message message, Transaction transaction, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var txnId = await _transactionsManager.GetTxnIdAsync(transaction, cancellationToken).ConfigureAwait(false);

            var transactionalState = txnId != null ? new TransactionalState {
                TxnId = txnId
            } : null;
            var tcs = TaskUtil.CreateTaskCompletionSource <bool>(cancellationToken);

            cancellationToken.Register(() => tcs.TrySetCanceled());
            message.DurabilityMode ??= _configuration.MessageDurabilityMode ?? DurabilityMode.Durable;
            Send(address, routingType, message, transactionalState, _onOutcome, tcs);
            await tcs.Task.ConfigureAwait(false);
        }
 public void Send(string address, RoutingType?routingType, Message message, CancellationToken cancellationToken)
 {
     while (true)
     {
         CheckClosed();
         try
         {
             _producer.Send(address, routingType, message, cancellationToken);
             return;
         }
         catch (ProducerClosedException)
         {
             HandleProducerClosed();
             Wait(cancellationToken);
             Log.RetryingSendAsync(Logger);
         }
     }
 }
        public async Task SendAsync(string address, RoutingType?routingType, Message message, Transaction transaction, CancellationToken cancellationToken = default)
        {
            while (true)
            {
                CheckClosed();
                try
                {
                    await _producer.SendAsync(address, routingType, message, transaction, cancellationToken).ConfigureAwait(false);

                    return;
                }
                catch (ProducerClosedException)
                {
                    HandleProducerClosed();
                    await WaitAsync(cancellationToken).ConfigureAwait(false);

                    Log.RetryingSendAsync(Logger);
                }
            }
        }
 protected void SendInternal(string address, RoutingType?routingType, Message message)
 {
     message.DurabilityMode ??= _configuration.MessageDurabilityMode ?? DurabilityMode.Nondurable;
     Send(address: address, routingType: routingType, message: message, deliveryState: null, callback: null, state: null);
 }
 public void PostSend(string address, RoutingType?routingType, Message message) => PostSendCalled = true;
 public void PreSend(string address, RoutingType?routingType, Message message)
 {
     _sendStart.Value = _metrics.Clock.Nanoseconds;
 }