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).
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Object> {
|
||||
|
||||
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.
|
||||
*
|
||||
* <p>The default value is <code>true</code>. To force creation of Spring
|
||||
* Integration Messages whose payload is the actual JMS Message, set this
|
||||
* to <code>false</code>.
|
||||
*/
|
||||
public void setExtractPayload(boolean extractPayload) {
|
||||
this.extractPayload = extractPayload;
|
||||
}
|
||||
|
||||
public Message<Object> receive() {
|
||||
Object receivedObject = this.getJmsTemplate().receiveAndConvert();
|
||||
if (receivedObject == null) {
|
||||
@@ -58,4 +74,14 @@ public class JmsDestinationPollingSource extends AbstractJmsTemplateBasedAdapter
|
||||
return new GenericMessage<Object>(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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
* <p>The default value is <code>true</code>. To force creation of JMS
|
||||
* Messages whose body is the actual Spring Integration Message instance,
|
||||
* set this to <code>false</code>.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="channel" type="xsd:string"/>
|
||||
<xsd:attribute name="header-mapper" type="xsd:string"/>
|
||||
<xsd:attribute name="extract-payload" type="xsd:string" default="true"/>
|
||||
</xsd:extension>
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
@@ -105,6 +106,7 @@
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="channel" type="xsd:string"/>
|
||||
<xsd:attribute name="header-mapper" type="xsd:string"/>
|
||||
<xsd:attribute name="extract-payload" type="xsd:string" default="true"/>
|
||||
</xsd:extension>
|
||||
</xsd:complexContent>
|
||||
</xsd:complexType>
|
||||
|
||||
Reference in New Issue
Block a user