internal void Acknowledge(Message.AckType ackType)
        {
            foreach (IMessageDelivery delivery in delivered.ToArray())
            {
                switch (ackType)
                {
                case Message.AckType.ACCEPTED:
                    AckConsumed(delivery);
                    break;

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

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

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

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

                default:
                    Tracer.WarnFormat("Unkown message acknowledgement type {0} for message {}", ackType, delivery.Message.NMSMessageId);
                    break;
                }
            }
            delivered.Clear();
        }
        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);
            }
        }