private Apache.NMS.IMessage SendAndReceive(IMessage requestMessage)
        {
            IConnection      connection      = CreateConnection();
            ISession         session         = null;
            IMessageProducer messageProducer = null;
            IMessageConsumer messageConsumer = null;
            IDestination     replyTo         = null;

            try
            {
                session = CreateSession(connection);
                Apache.NMS.IMessage jmsRequest = this.messageConverter.ToMessage(requestMessage, session);
                messageProducer = session.CreateProducer(this.GetRequestDestination(session));
                messageProducer.DeliveryMode = deliveryMode;
                messageProducer.Priority     = priority;
                messageProducer.TimeToLive   = timeToLive;
                replyTo = GetReplyDestination(session);
                jmsRequest.NMSReplyTo = replyTo;
                connection.Start();
                messageProducer.Send(jmsRequest);
                if (replyTo is ITemporaryQueue || replyTo is ITemporaryTopic)
                {
                    messageConsumer = session.CreateConsumer(replyTo);
                }
                else
                {
                    String messageId       = jmsRequest.NMSMessageId.Replace("'", "''");
                    String messageSelector = "NMSCorrelationID = '" + messageId + "'";
                    messageConsumer = session.CreateConsumer(replyTo, messageSelector);
                }
                return((TimeSpan.Compare(receiveTimeout, TimeSpan.FromMilliseconds(0)) == 1)
                           ? messageConsumer.Receive(receiveTimeout)
                           : messageConsumer.Receive());
            }
            finally
            {
                NmsUtils.CloseMessageProducer(messageProducer);
                NmsUtils.CloseMessageConsumer(messageConsumer);
                this.DeleteDestinationIfTemporary(session, replyTo);
                NmsUtils.CloseSession(session);

                ConnectionFactoryUtils.ReleaseConnection(connection, this.connectionFactory, true);
            }
        }
 /// <summary>
 /// Close the message consumers and sessions.
 /// </summary>
 /// <throws>NMSException if destruction failed </throws>
 protected override void DoShutdown()
 {
     lock (consumersMonitor)
     {
         if (consumers != null)
         {
             logger.Debug("Closing NMS MessageConsumers");
             foreach (IMessageConsumer messageConsumer in consumers)
             {
                 NmsUtils.CloseMessageConsumer(messageConsumer);
             }
         }
         if (sessions != null)
         {
             logger.Debug("Closing NMS Sessions");
             foreach (ISession session in sessions)
             {
                 NmsUtils.CloseSession(session);
             }
         }
         consumers = null;
         sessions  = null;
     }
 }