From 91638c78e25d26cbf7f8418013620849ea7e5cf4 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Thu, 13 Nov 2008 23:01:54 +0000 Subject: [PATCH] Added support for the 'extractPayload' property for both JMS inbound and outbound Channel Adapters. This includes support for the "extract-payload" attribute in their respective XML elements in the "jms" namespace (INT-460). --- .../jms/AbstractJmsTemplateBasedAdapter.java | 8 +++--- .../jms/JmsDestinationPollingSource.java | 26 ++++++++++++++++++ .../jms/JmsSendingMessageHandler.java | 27 +++++++++++++++++++ .../JmsInboundChannelAdapterParser.java | 2 ++ .../JmsOutboundChannelAdapterParser.java | 2 ++ .../jms/config/spring-integration-jms-1.0.xsd | 2 ++ 6 files changed, 62 insertions(+), 5 deletions(-) diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java index 2f96256b31..259c0cec7b 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java @@ -21,7 +21,6 @@ import javax.jms.Destination; import org.springframework.beans.factory.InitializingBean; import org.springframework.jms.core.JmsTemplate; -import org.springframework.jms.support.converter.MessageConverter; import org.springframework.util.Assert; /** @@ -109,10 +108,7 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea + " 'destination' (or 'destination-name') are required."); this.jmsTemplate = this.createDefaultJmsTemplate(); } - MessageConverter converter = this.jmsTemplate.getMessageConverter(); - converter = (converter != null && converter instanceof HeaderMappingMessageConverter) ? - converter : new HeaderMappingMessageConverter(converter, this.headerMapper); - this.jmsTemplate.setMessageConverter(converter); + this.configureMessageConverter(this.jmsTemplate, this.headerMapper); this.initialized = true; } } @@ -129,4 +125,6 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea return jmsTemplate; } + protected abstract void configureMessageConverter(JmsTemplate jmsTemplate, JmsHeaderMapper headerMapper); + } diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java index 2d40986563..42fd0ef2ae 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java @@ -23,6 +23,7 @@ import org.springframework.integration.core.Message; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.message.MessageSource; import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.support.converter.MessageConverter; /** * A source for receiving JMS Messages with a polling listener. This source is @@ -34,6 +35,9 @@ import org.springframework.jms.core.JmsTemplate; */ public class JmsDestinationPollingSource extends AbstractJmsTemplateBasedAdapter implements MessageSource { + private volatile boolean extractPayload = true; + + public JmsDestinationPollingSource(JmsTemplate jmsTemplate) { super(jmsTemplate); } @@ -47,6 +51,18 @@ public class JmsDestinationPollingSource extends AbstractJmsTemplateBasedAdapter } + /** + * Specify whether the payload should be extracted from each received JMS + * Message to be used as the Spring Integration Message payload. + * + *

The default value is true. To force creation of Spring + * Integration Messages whose payload is the actual JMS Message, set this + * to false. + */ + public void setExtractPayload(boolean extractPayload) { + this.extractPayload = extractPayload; + } + public Message receive() { Object receivedObject = this.getJmsTemplate().receiveAndConvert(); if (receivedObject == null) { @@ -58,4 +74,14 @@ public class JmsDestinationPollingSource extends AbstractJmsTemplateBasedAdapter return new GenericMessage(receivedObject); } + @Override + protected void configureMessageConverter(JmsTemplate jmsTemplate, JmsHeaderMapper headerMapper) { + MessageConverter converter = jmsTemplate.getMessageConverter(); + if (converter == null || !(converter instanceof HeaderMappingMessageConverter)) { + HeaderMappingMessageConverter hmmc = new HeaderMappingMessageConverter(converter, headerMapper); + hmmc.setExtractJmsMessageBody(this.extractPayload); + jmsTemplate.setMessageConverter(hmmc); + } + } + } diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java index 1557439f6b..bb1ed14524 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java @@ -18,6 +18,8 @@ package org.springframework.integration.jms; import org.springframework.integration.core.Message; import org.springframework.integration.message.MessageHandler; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.support.converter.MessageConverter; /** * A MessageConsumer that sends the converted Message payload within @@ -27,6 +29,21 @@ import org.springframework.integration.message.MessageHandler; */ public class JmsSendingMessageHandler extends AbstractJmsTemplateBasedAdapter implements MessageHandler { + private volatile boolean extractPayload = true; + + + /** + * Specify whether the payload should be extracted from each Spring + * Integration Message to be converted to the body of a JMS Message. + * + *

The default value is true. To force creation of JMS + * Messages whose body is the actual Spring Integration Message instance, + * set this to false. + */ + public void setExtractPayload(boolean extractPayload) { + this.extractPayload = extractPayload; + } + public final void handleMessage(final Message message) { if (message == null) { throw new IllegalArgumentException("message must not be null"); @@ -34,4 +51,14 @@ public class JmsSendingMessageHandler extends AbstractJmsTemplateBasedAdapter im this.getJmsTemplate().convertAndSend(message); } + @Override + protected void configureMessageConverter(JmsTemplate jmsTemplate, JmsHeaderMapper headerMapper) { + MessageConverter converter = jmsTemplate.getMessageConverter(); + if (converter == null || !(converter instanceof HeaderMappingMessageConverter)) { + HeaderMappingMessageConverter hmmc = new HeaderMappingMessageConverter(converter, headerMapper); + hmmc.setExtractIntegrationMessagePayload(this.extractPayload); + jmsTemplate.setMessageConverter(hmmc); + } + } + } diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java index 3b6de1eca3..331f2854e5 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractPollingInboundChannelAdapterParser; +import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.integration.jms.JmsDestinationPollingSource; import org.springframework.util.StringUtils; @@ -77,6 +78,7 @@ public class JmsInboundChannelAdapterParser extends AbstractPollingInboundChanne if (StringUtils.hasText(headerMapper)) { builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper); } + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload"); return BeanDefinitionReaderUtils.registerWithGeneratedName(builder.getBeanDefinition(), parserContext.getRegistry()); } diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java index 1257bcc427..5a629137bd 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.integration.config.xml.AbstractOutboundChannelAdapterParser; +import org.springframework.integration.config.xml.IntegrationNamespaceUtils; import org.springframework.integration.jms.JmsSendingMessageHandler; import org.springframework.util.StringUtils; @@ -66,6 +67,7 @@ public class JmsOutboundChannelAdapterParser extends AbstractOutboundChannelAdap if (StringUtils.hasText(headerMapper)) { builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper); } + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload"); return builder.getBeanDefinition(); } 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 3f5114c8e2..5f0cb2fd47 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 @@ -32,6 +32,7 @@ + @@ -105,6 +106,7 @@ +