private void AckModified(IMessageDelivery delivery, bool deliveryFailed, bool undeliverableHere = false)
 {
     Message.Message nmsMessage = delivery.Message;
     Tracer.DebugFormat("Consumer {0} Acking Modified for Message {1}{2}{3}.", ConsumerId, nmsMessage.NMSMessageId,
                        deliveryFailed ? " Delivery Failed" : "",
                        undeliverableHere ? " Undeliveryable Here" : "");
     Amqp.Message amqpMessage = (nmsMessage.GetMessageCloak() as Message.AMQP.AMQPMessageCloak).AMQPMessage;
     //TODO use Link.Modified from amqpNetLite 2.0.0
     this.Link.Modify(amqpMessage, deliveryFailed, undeliverableHere, null);
 }
        private bool IsMessageRedeliveryExceeded(IMessageDelivery delivery)
        {
            Message.Message   message = delivery.Message;
            IRedeliveryPolicy policy  = this.Session.Connection.RedeliveryPolicy;

            if (policy != null && policy.MaximumRedeliveries >= 0)
            {
                IMessageCloak msgCloak = message.GetMessageCloak();
                return(msgCloak.RedeliveryCount > policy.MaximumRedeliveries);
            }
            return(false);
        }
 public IMessage ReceiveNoWait()
 {
     ThrowIfClosed();
     ThrowIfAsync();
     if (TryDequeue(out IMessageDelivery delivery, 0))
     {
         Message.Message copy = delivery.Message.Copy();
         PrepareMessageForDelivery(copy);
         AckReceived(delivery);
         return(copy);
     }
     return(null);
 }
 private bool IsMessageExpired(IMessageDelivery delivery)
 {
     Message.Message message = delivery.Message;
     if (message.NMSTimeToLive != TimeSpan.Zero)
     {
         DateTime now = DateTime.UtcNow;
         if (!IsBrowser && (message.NMSTimestamp + message.NMSTimeToLive) < now)
         {
             return(true);
         }
     }
     return(false);
 }
        public IMessage Receive(TimeSpan timeout)
        {
            ThrowIfClosed();
            ThrowIfAsync();
            int timeoutMilis = Convert.ToInt32(timeout.TotalMilliseconds);

            if (timeoutMilis == 0)
            {
                timeoutMilis = -1;
            }
            if (TryDequeue(out IMessageDelivery delivery, timeoutMilis))
            {
                Message.Message copy = delivery.Message.Copy();
                PrepareMessageForDelivery(copy);
                AckReceived(delivery);
                return(copy);
            }
            return(null);
        }
        internal void AcknowledgeMessage(Message.Message message, Message.AckType ackType)
        {
            ThrowIfClosed();
            IMessageDelivery nmsDelivery = null;

            foreach (IMessageDelivery delivery in delivered)
            {
                if (delivery.Message.Equals(message))
                {
                    nmsDelivery = delivery;
                }
            }
            if (nmsDelivery == null)
            {
                nmsDelivery = new MessageDelivery(message);
            }
            switch (ackType)
            {
            case Message.AckType.ACCEPTED:
                AckConsumed(nmsDelivery);
                break;

            case Message.AckType.MODIFIED_FAILED:
                AckModified(nmsDelivery, true);
                break;

            case Message.AckType.MODIFIED_FAILED_UNDELIVERABLE:
                AckModified(nmsDelivery, true, true);
                break;

            case Message.AckType.REJECTED:
                AckRejected(nmsDelivery);
                break;

            case Message.AckType.RELEASED:
                AckReleased(nmsDelivery);
                break;

            default:
                throw new NMSException("Unkown message acknowledgement type " + ackType);
            }
        }
 protected void PrepareMessageForDelivery(Message.Message message)
 {
     if (message == null)
     {
         return;
     }
     if (message is Message.BytesMessage)
     {
         (message as Message.BytesMessage).Reset();
     }
     else if (message is Message.StreamMessage)
     {
         (message as Message.StreamMessage).Reset();
     }
     else
     {
         message.IsReadOnly = true;
     }
     message.IsReadOnlyProperties = true;
 }
            public void DispatchMessageListeners()
            {
                IMessageDelivery delivery = null;

                Message.Message nmsProviderMessage = null;
                if (consumer.IsClosed)
                {
                    return;
                }
                consumer.EnterMessageListenerEvent();
                // the consumer pending Message delivery task

                while ((delivery = consumer.messageQueue.DequeueNoWait()) != null)
                {
                    nmsProviderMessage = delivery.Message;
                    consumer.AddTaskRef();
                    consumer.messageDispatchCount++;
                    try
                    {
                        if (consumer.IsMessageExpired(delivery))
                        {
                            consumer.AckModified(delivery, true);
                        }
                        else if (consumer.IsMessageRedeliveryExceeded(delivery))
                        {
                            consumer.AckModified(delivery, true, true);
                        }
                        else
                        {
                            bool deliveryFailed = false;
                            bool isAutoOrDupsOk = consumer.Session.AcknowledgementMode.Equals(AcknowledgementMode.AutoAcknowledge) ||
                                                  consumer.Session.AcknowledgementMode.Equals(AcknowledgementMode.DupsOkAcknowledge);
                            if (isAutoOrDupsOk)
                            {
                                consumer.delivered.AddLast(delivery);
                            }
                            else
                            {
                                consumer.AckReceived(delivery);
                            }

                            Message.Message copy = nmsProviderMessage.Copy();
                            try
                            {
                                consumer.Session.ClearRecovered();
                                consumer.PrepareMessageForDelivery(copy);
                                if (Tracer.IsDebugEnabled)
                                {
                                    Tracer.DebugFormat("Invoking Client Message Listener Callback for message {0}.", copy.NMSMessageId);
                                }
                                consumer.OnMessage(copy);
                            }
                            catch (SystemException se)
                            {
                                Tracer.WarnFormat("Caught Exception on MessageListener for Consumer {0}. Message {1}.", consumer.Id, se.Message);
                                deliveryFailed = true;
                            }

                            if (isAutoOrDupsOk && !consumer.Session.IsRecovered)
                            {
                                if (!deliveryFailed)
                                {
                                    consumer.AckConsumed(delivery);
                                }
                                else
                                {
                                    consumer.AckReleased(delivery);
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        // unhandled failure
                        consumer.Session.OnException(e);
                    }
                    consumer.RemoveTaskRef();
                }
                consumer.LeaveMessageListenerEvent();
            }
        protected void DoSend(IDestination destination, IMessage message, MsgDeliveryMode deliveryMode, MsgPriority priority, TimeSpan timeToLive)
        {
            this.Attach();
            bool sendSync = deliveryMode.Equals(MsgDeliveryMode.Persistent);

            if (destination.IsTemporary && (destination as TemporaryDestination).IsDeleted)
            {
                throw new InvalidDestinationException("Can not send message on deleted temporary topic.");
            }
            message.NMSDestination  = destination;
            message.NMSDeliveryMode = deliveryMode;
            message.NMSPriority     = priority;
            // If there is  timeToLive, set it before setting NMSTimestamp as timeToLive
            // is required to calculate absolute expiry time.
            // TBD: If the messageProducer has a non-default timeToLive and the message
            // already has a timeToLive set by application, which should take precedence, this
            // code overwrites the message TimeToLive in this case but not if the producer TimeToLive
            // is the default ...
            if (timeToLive != NMSConstants.defaultTimeToLive)
            {
                message.NMSTimeToLive = timeToLive;
            }
            if (!DisableMessageTimestamp)
            {
                message.NMSTimestamp = DateTime.UtcNow;
            }


            if (!DisableMessageID)
            {
                message.NMSMessageId = MessageIdGenerator.GenerateId().ToString();
            }

            Amqp.Message amqpmsg = null;
            if (message is Message.Message)
            {
                Message.Message copy = (message as Message.Message).Copy();
                copy.NMSDestination = DestinationTransformation.Transform(Session.Connection, destination);
                PrepareMessageForSend(copy);
                IMessageCloak cloak = copy.GetMessageCloak();
                if (cloak is AMQPMessageCloak)
                {
                    amqpmsg = (cloak as AMQPMessageCloak).AMQPMessage;
                }
            }
            else
            {
                Message.Message nmsmsg = this.Session.Connection.TransformFactory.TransformMessage <Message.Message>(message);
                PrepareMessageForSend(nmsmsg);
                IMessageCloak cloak = nmsmsg.GetMessageCloak().Copy();
                if (cloak is AMQPMessageCloak)
                {
                    amqpmsg = (cloak as AMQPMessageCloak).AMQPMessage;
                }
            }



            if (amqpmsg != null)
            {
                if (Tracer.IsDebugEnabled)
                {
                    Tracer.DebugFormat("Sending message : {0}", message.ToString());
                }

                if (sendSync)
                {
                    DoAMQPSendSync(amqpmsg, this.RequestTimeout);
                }
                else
                {
                    DoAMQPSendAsync(amqpmsg, HandleAsyncAMQPMessageOutcome);
                }
            }
        }