From 01cf5cfc18d26f676de1f3987c14e297ae9b81f9 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Mon, 13 Sep 2010 16:50:46 -0400 Subject: [PATCH] INT-1363 separating Destination/destinationName from JmsTemplate configuration --- .../jms/AbstractJmsTemplateBasedAdapter.java | 20 +++++++--- .../jms/JmsSendingMessageHandler.java | 37 ++++++++++++++++--- .../jms/config/JmsAdapterParserUtils.java | 19 +++++++++- .../JmsOutboundChannelAdapterParser.java | 9 +---- .../JmsOutboundChannelAdapterParserTests.java | 6 ++- 5 files changed, 69 insertions(+), 22 deletions(-) diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java index f15440ce3e..3af9dc8b35 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java @@ -107,10 +107,18 @@ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectS this.destination = destination; } + Destination getDestination() { + return this.destination; + } + public void setDestinationName(String destinationName) { this.destinationName = destinationName; } + String getDestinationName() { + return this.destinationName; + } + public void setPubSubDomain(boolean pubSubDomain) { this.pubSubDomain = pubSubDomain; } @@ -133,8 +141,8 @@ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectS public void setHeaderMapper(JmsHeaderMapper headerMapper) { this.headerMapper = headerMapper; } - - JmsHeaderMapper getHeaderMapper(){ + + JmsHeaderMapper getHeaderMapper() { return this.headerMapper; } @@ -187,10 +195,6 @@ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectS return; } if (this.jmsTemplate == null) { - Assert.isTrue(this.connectionFactory != null - && (this.destination != null || this.destinationName != null), - "Either a 'jmsTemplate' or *both* 'connectionFactory' and" - + " 'destination' (or 'destination-name') are required."); this.jmsTemplate = this.createJmsTemplate(); } this.initialized = true; @@ -198,6 +202,10 @@ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectS } private JmsTemplate createJmsTemplate() { + Assert.isTrue(this.connectionFactory != null + && (this.destination != null || this.destinationName != null), + "Either a 'jmsTemplate' or *both* 'connectionFactory' and" + + " 'destination' (or 'destination-name') are required."); JmsTemplate jmsTemplate = new JmsTemplate(); jmsTemplate.setConnectionFactory(this.connectionFactory); if (this.destination != null) { diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java index 2dc14926dc..12cdb3616e 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java @@ -16,6 +16,7 @@ package org.springframework.integration.jms; +import javax.jms.Destination; import javax.jms.JMSException; import org.springframework.core.Ordered; @@ -76,12 +77,38 @@ public class JmsSendingMessageHandler extends AbstractJmsTemplateBasedAdapter im if (this.shouldExtractPayload()) { objectToSend = messageToSend.getPayload(); } - this.getJmsTemplate().convertAndSend(objectToSend, new MessagePostProcessor() { - public javax.jms.Message postProcessMessage(javax.jms.Message jmsMessage) throws JMSException { - getHeaderMapper().fromHeaders(messageToSend.getHeaders(), jmsMessage); - return jmsMessage; + MessagePostProcessor messagePostProcessor = new HeaderMappingMessagePostProcessor(messageToSend, this.getHeaderMapper()); + Destination destination = this.getDestination(); + if (destination != null) { + this.getJmsTemplate().convertAndSend(destination, objectToSend, messagePostProcessor); + } + else { + String destinationName = this.getDestinationName(); + if (destinationName != null) { + this.getJmsTemplate().convertAndSend(destinationName, objectToSend, messagePostProcessor); } - }); + else { // fallback to default destination of the template + this.getJmsTemplate().convertAndSend(objectToSend, messagePostProcessor); + } + } + } + + + private static class HeaderMappingMessagePostProcessor implements MessagePostProcessor { + + private final Message integrationMessage; + + private final JmsHeaderMapper headerMapper; + + private HeaderMappingMessagePostProcessor(Message integrationMessage, JmsHeaderMapper headerMapper) { + this.integrationMessage = integrationMessage; + this.headerMapper = headerMapper; + } + + public javax.jms.Message postProcessMessage(javax.jms.Message jmsMessage) throws JMSException { + this.headerMapper.fromHeaders(this.integrationMessage.getHeaders(), jmsMessage); + return jmsMessage; + } } } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java index fce101b8ee..757ada7496 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java @@ -18,7 +18,10 @@ package org.springframework.integration.jms.config; import org.w3c.dom.Element; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.util.StringUtils; /** @@ -53,7 +56,7 @@ abstract class JmsAdapterParserUtils { static final String HEADER_MAPPER_PROPERTY = "headerMapper"; private static final String[] JMS_TEMPLATE_ATTRIBUTES = { "destination", "destination-name", - "connection-factory", "message-converter", "time-to-live", "priority", "delivery-persistent", "explicit-qos-enabled" }; + "connection-factory", "message-converter", "destination-resolver", "time-to-live", "priority", "delivery-persistent", "explicit-qos-enabled" }; /* @@ -106,6 +109,20 @@ abstract class JmsAdapterParserUtils { } } + static BeanDefinition parseJmsTemplateBeanDefinition(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( + "org.springframework.jms.core.JmsTemplate"); + builder.addPropertyReference(JmsAdapterParserUtils.CONNECTION_FACTORY_PROPERTY, + JmsAdapterParserUtils.determineConnectionFactoryBeanName(element, parserContext)); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "destination-resolver"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "time-to-live"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "priority"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "delivery-persistent"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "explicit-qos-enabled"); + return builder.getBeanDefinition(); + } + static void verifyNoJmsTemplateAttributes(Element element, ParserContext parserContext) { for (String attributeName : JMS_TEMPLATE_ATTRIBUTES) { if (element.hasAttribute(attributeName)) { diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java index e1c221ac53..88fef7075c 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java @@ -47,8 +47,7 @@ public class JmsOutboundChannelAdapterParser extends AbstractOutboundChannelAdap builder.addConstructorArgReference(jmsTemplate); } else if (hasDestinationRef ^ hasDestinationName) { - builder.addPropertyReference(JmsAdapterParserUtils.CONNECTION_FACTORY_PROPERTY, - JmsAdapterParserUtils.determineConnectionFactoryBeanName(element, parserContext)); + builder.addConstructorArgValue(JmsAdapterParserUtils.parseJmsTemplateBeanDefinition(element, parserContext)); if (StringUtils.hasText(destination)) { builder.addPropertyReference(JmsAdapterParserUtils.DESTINATION_PROPERTY, destination); } @@ -65,13 +64,7 @@ public class JmsOutboundChannelAdapterParser extends AbstractOutboundChannelAdap if (StringUtils.hasText(headerMapper)) { builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper); } - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); - IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "destination-resolver"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "time-to-live"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "priority"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "delivery-persistent"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "explicit-qos-enabled"); return builder.getBeanDefinition(); } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java index 40be26a252..370e302313 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java @@ -120,8 +120,10 @@ public class JmsOutboundChannelAdapterParserTests { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "jmsOutboundWithMessageConverter.xml", this.getClass()); EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("adapter"); - DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(new DirectFieldAccessor(endpoint).getPropertyValue("handler")); - MessageConverter messageConverter = (MessageConverter) handlerAccessor.getPropertyValue("messageConverter"); + DirectFieldAccessor handlerAccessor = new DirectFieldAccessor( + new DirectFieldAccessor(endpoint).getPropertyValue("handler")); + JmsTemplate jmsTemlate = (JmsTemplate) handlerAccessor.getPropertyValue("jmsTemplate"); + MessageConverter messageConverter = jmsTemlate.getMessageConverter(); assertNotNull(messageConverter); assertEquals(TestMessageConverter.class, messageConverter.getClass()); }