private IMessage Handle(Delivery delivery) { if (delivery == null && Shutdown != null) { throw new ShutdownSignalException(Shutdown); } if (delivery == null) { return(null); } var body = delivery.Body; var messageProperties = MessageHeadersConverter.ToMessageHeaders(delivery.Properties, delivery.Envelope, EncodingUtils.Utf8); var accesor = RabbitHeaderAccessor.GetMutableAccessor(messageProperties); accesor.ConsumerTag = delivery.ConsumerTag; accesor.ConsumerQueue = delivery.Queue; var message = Message.Create(body, accesor.MessageHeaders); Logger?.LogDebug("Received message: {message}", message); if (messageProperties.DeliveryTag() != null) { DeliveryTags.Add(messageProperties.DeliveryTag().Value); } if (Transactional && !LocallyTransacted) { ConnectionFactoryUtils.RegisterDeliveryTag(ConnectionFactory, Channel, delivery.Envelope.DeliveryTag); } return(message); }
/// <summary>Perform a commit or message acknowledgement, as appropriate</summary> /// <param name="locallyTransacted">if set to <c>true</c> [locally transacted].</param> /// <returns>True if committed, else false.</returns> public bool CommitIfNecessary(bool locallyTransacted) { if (this.deliveryTags == null || this.deliveryTags.Count < 1) { return(false); } try { var ackRequired = !this.acknowledgeMode.IsAutoAck() && !this.acknowledgeMode.IsManual(); if (ackRequired) { if (this.transactional && !locallyTransacted) { // Not locally transacted but it is transacted so it // could be synchronized with an external transaction foreach (var deliveryTag in this.deliveryTags) { ConnectionFactoryUtils.RegisterDeliveryTag(this.connectionFactory, this.channel, deliveryTag); } } else { if (this.deliveryTags != null && this.deliveryTags.Count > 0) { var copiedTags = new List <long>(this.deliveryTags); if (copiedTags.Count > 0) { var deliveryTag = copiedTags[copiedTags.Count - 1]; this.channel.BasicAck((ulong)deliveryTag, true); } } } } if (locallyTransacted) { // For manual acks we still need to commit RabbitUtils.CommitIfNecessary(this.channel); } } finally { this.deliveryTags.Clear(); } return(true); }