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); } }