Example #1
0
        public void GatewayWithConnectionFactoryAndDestinationName()
        {
            XmlApplicationContext ctx =
                (XmlApplicationContext)
                NmsTestUtils.GetContext(@"Nms\Config\NmsGatewayWithConnectionFactoryAndDestinationName.xml");
            IPollableChannel         channel = (IPollableChannel)ctx.GetObject("requestChannel");
            NmsMessageDrivenEndpoint gateway = (NmsMessageDrivenEndpoint)ctx.GetObject("nmsGateway");

            Assert.That(gateway.GetType(), Is.EqualTo(typeof(NmsMessageDrivenEndpoint)));
            ctx.Start();

            ThreadPerTaskExecutor executor = new ThreadPerTaskExecutor();

            executor.Execute(delegate
            {
                SimpleMessageListenerContainer listenerContainer =
                    (SimpleMessageListenerContainer)
                    ctx.GetObject("Spring.Messaging.Nms.Listener.SimpleMessageListenerContainer#0");
                ISessionAwareMessageListener messageListener =
                    (ISessionAwareMessageListener)listenerContainer.MessageListener;
                messageListener.OnMessage(new StubTextMessage("message-driven-test"),
                                          new StubSession("message-driven-test"));
            });

            IMessage message = channel.Receive(TimeSpan.FromMilliseconds(3000));

            Assert.That(message, Is.Not.Null);
            Assert.That(message.Payload, Is.EqualTo("message-driven-test"));
            ctx.Stop();
        }
        /// <summary>
        /// Invoke the specified listener as Spring SessionAwareMessageListener,
        /// exposing a new NMS Session (potentially with its own transaction)
        /// to the listener if demanded.
        /// </summary>
        /// <param name="listener">The Spring ISessionAwareMessageListener to invoke.</param>
        /// <param name="session">The session to operate on.</param>
        /// <param name="message">The received message.</param>
        /// <exception cref="NMSException">If thrown by NMS API methods.</exception>
        /// <see cref="ISessionAwareMessageListener"/>
        /// <see cref="ExposeListenerSession"/>
        protected virtual void DoInvokeListener(ISessionAwareMessageListener listener, ISession session, IMessage message)
        {
            IConnection conToClose     = null;
            ISession    sessionToClose = null;

            try
            {
                ISession sessionToUse = session;
                if (!ExposeListenerSession)
                {
                    //We need to expose a separate Session.
                    conToClose     = CreateConnection();
                    sessionToClose = CreateSession(conToClose);
                    sessionToUse   = sessionToClose;
                }
                // Actually invoke the message listener
                if (logger.IsDebugEnabled)
                {
                    logger.Debug("Invoking listener with message of type [" + message.GetType() +
                                 "] and session [" + sessionToUse + "]");
                }
                listener.OnMessage(message, sessionToUse);
                // Clean up specially exposed Session, if any
                if (sessionToUse != session)
                {
                    if (sessionToUse.Transacted && SessionTransacted)
                    {
                        // Transacted session created by this container -> commit.
                        NmsUtils.CommitIfNecessary(sessionToUse);
                    }
                }
            } finally
            {
                NmsUtils.CloseSession(sessionToClose);
                NmsUtils.CloseConnection(conToClose);
            }
        }
 /// <summary>
 /// Invoke the specified listener as Spring ISessionAwareMessageListener,
 /// exposing a new EMS Session (potentially with its own transaction)
 /// to the listener if demanded.
 /// </summary>
 /// <param name="listener">The Spring ISessionAwareMessageListener to invoke.</param>
 /// <param name="session">The session to operate on.</param>
 /// <param name="message">The received message.</param>
 /// <exception cref="EMSException">If thrown by EMS API methods.</exception>
 /// <see cref="ISessionAwareMessageListener"/>
 /// <see cref="ExposeListenerSession"/>
 protected virtual void DoInvokeListener(ISessionAwareMessageListener listener, ISession session, Message message)
 {
     IConnection conToClose = null;
     ISession sessionToClose = null;
     try
     {
         ISession sessionToUse = session;
         if (!ExposeListenerSession)
         {
             //We need to expose a separate Session.
             conToClose = CreateConnection();
             sessionToClose = CreateSession(conToClose);
             sessionToUse = sessionToClose;
         }
         // Actually invoke the message listener
         if (logger.IsDebugEnabled)
         {
             logger.Debug("Invoking listener with message of type [" + message.GetType() + 
                          "] and session [" + sessionToUse + "]");
         }
         listener.OnMessage(message, sessionToUse);
         // Clean up specially exposed Session, if any
         if (sessionToUse != session)
         {
             if (sessionToUse.Transacted && SessionTransacted)
             {
                 // Transacted session created by this container -> commit.
                 EmsUtils.CommitIfNecessary(sessionToUse);
             }                        
         }
     } finally
     {
         EmsUtils.CloseSession(sessionToClose);
         EmsUtils.CloseConnection(conToClose);
     }
 }