diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java index 47cdb13828..fe0cbf4a23 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java @@ -18,19 +18,23 @@ package org.springframework.integration.jms; import java.io.Serializable; +import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.QueueRequestor; import javax.jms.QueueSession; import javax.jms.Session; +import org.springframework.beans.factory.InitializingBean; import org.springframework.integration.core.Message; +import org.springframework.integration.core.MessageChannel; import org.springframework.integration.endpoint.AbstractReplyProducingMessageConsumer; import org.springframework.integration.endpoint.ReplyMessageHolder; import org.springframework.integration.message.MessageBuilder; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.SessionCallback; import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.util.Assert; /** @@ -38,22 +42,31 @@ import org.springframework.util.Assert; * * @author Mark Fisher */ -public class JmsOutboundGateway extends AbstractReplyProducingMessageConsumer { +public class JmsOutboundGateway extends AbstractReplyProducingMessageConsumer implements InitializingBean { private volatile Queue jmsQueue; - private volatile JmsTemplate jmsTemplate; - private volatile MessageConverter messageConverter; + private final JmsTemplate jmsTemplate = new JmsTemplate(); + public void setJmsQueue(Queue jmsQueue) { this.jmsQueue = jmsQueue; } - public void setJmsTemplate(JmsTemplate jmsTemplate) { - this.jmsTemplate = jmsTemplate; - this.messageConverter = new HeaderMappingMessageConverter(jmsTemplate.getMessageConverter()); + public void setConnectionFactory(ConnectionFactory connectionFactory) { + this.jmsTemplate.setConnectionFactory(connectionFactory); + } + + public void setReplyChannel(MessageChannel replyChannel) { + this.setOutputChannel(replyChannel); + } + + public void afterPropertiesSet() { + this.jmsTemplate.afterPropertiesSet(); + Assert.notNull(this.jmsQueue, "jmsQueue must not be null"); + this.messageConverter = new HeaderMappingMessageConverter(new SimpleMessageConverter()); } @Override @@ -63,7 +76,6 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageConsumer { public Object doInJms(Session session) throws JMSException { Assert.state(session instanceof QueueSession, "QueueSession is required for the outbound JMS Gateway"); - Assert.state(jmsQueue != null, "Queue is required"); javax.jms.Message jmsRequest = (messageConverter != null) ? messageConverter.toMessage(requestMessage, session) : session.createObjectMessage((Serializable) requestMessage); diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsNamespaceHandler.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsNamespaceHandler.java index 26521cdec1..3742aa0aa7 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsNamespaceHandler.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsNamespaceHandler.java @@ -30,6 +30,7 @@ public class JmsNamespaceHandler extends NamespaceHandlerSupport { public void init() { this.registerBeanDefinitionParser("inbound-gateway", new JmsInboundGatewayParser()); this.registerBeanDefinitionParser("inbound-channel-adapter", new JmsInboundChannelAdapterParser()); + this.registerBeanDefinitionParser("outbound-gateway", new JmsOutboundGatewayParser()); this.registerBeanDefinitionParser("outbound-channel-adapter", new JmsOutboundChannelAdapterParser()); this.registerBeanDefinitionParser("header-enricher", new SimpleHeaderEnricherParser( JmsHeaders.TRANSPORT_PREFIX, new String[] { "reply-to" })); diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java new file mode 100644 index 0000000000..54cfb9f30c --- /dev/null +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundGatewayParser.java @@ -0,0 +1,48 @@ +/* + * Copyright 2002-2008 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.jms.config; + +import org.w3c.dom.Element; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.config.xml.AbstractConsumerEndpointParser; +import org.springframework.integration.config.xml.IntegrationNamespaceUtils; +import org.springframework.integration.jms.JmsOutboundGateway; + +/** + * Parser for the <outbound-gateway> element of the integration 'jms' namespace. + * + * @author Mark Fisher + */ +public class JmsOutboundGatewayParser extends AbstractConsumerEndpointParser { + + @Override + protected String getInputChannelAttributeName() { + return "request-channel"; + } + + @Override + protected BeanDefinitionBuilder parseConsumer(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(JmsOutboundGateway.class); + builder.addPropertyReference("connectionFactory", element.getAttribute("connection-factory")); + builder.addPropertyReference("jmsQueue", element.getAttribute("jms-queue")); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "reply-channel"); + return builder; + } + +} diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/spring-integration-jms-1.0.xsd b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/spring-integration-jms-1.0.xsd index 346ecebdf4..442d837e7f 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/spring-integration-jms-1.0.xsd +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/spring-integration-jms-1.0.xsd @@ -40,7 +40,7 @@ - Defines a JMS-based gateway adapter. + Defines an inbound JMS-based Messaging Gateway. @@ -62,6 +62,23 @@ + + + + Defines an outbound JMS-based Messaging Gateway. + + + + + + + + + + + + + diff --git a/org.springframework.integration.samples/src/main/java/org/springframework/integration/samples/jms/outboundGateway.xml b/org.springframework.integration.samples/src/main/java/org/springframework/integration/samples/jms/outboundGateway.xml index 3a7c295556..fae3ed5026 100644 --- a/org.springframework.integration.samples/src/main/java/org/springframework/integration/samples/jms/outboundGateway.xml +++ b/org.springframework.integration.samples/src/main/java/org/springframework/integration/samples/jms/outboundGateway.xml @@ -19,19 +19,7 @@ - - - - - - - - - - - - - +