diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/HeaderMappingMessageConverter.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/HeaderMappingMessageConverter.java index d945b45733..54ed61810e 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/HeaderMappingMessageConverter.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/HeaderMappingMessageConverter.java @@ -16,11 +16,9 @@ package org.springframework.integration.jms; -import java.io.Serializable; import java.util.Map; import javax.jms.JMSException; -import javax.jms.ObjectMessage; import javax.jms.Session; import org.apache.commons.logging.Log; @@ -31,7 +29,7 @@ import org.springframework.integration.core.MessageHeaders; import org.springframework.integration.message.MessageBuilder; import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.MessageConverter; -import org.springframework.util.Assert; +import org.springframework.jms.support.converter.SimpleMessageConverter; /** * A {@link MessageConverter} implementation that is capable of delegating to @@ -57,13 +55,14 @@ public class HeaderMappingMessageConverter implements MessageConverter { private final JmsHeaderMapper headerMapper; - private volatile boolean extractPayload; + private volatile boolean extractRequestPayload = true; + + private volatile boolean extractReplyPayload = true; /** - * Create a HeaderMappingMessageConverter instance that will not - * delegate to another {@link MessageConverter} and will use the default - * implementation of the {@link JmsHeaderMapper} strategy. + * Create a HeaderMappingMessageConverter instance that will rely on the + * default {@link SimpleMessageConverter} and {@link DefaultJmsHeaderMapper}. */ public HeaderMappingMessageConverter() { this(null, null); @@ -78,36 +77,54 @@ public class HeaderMappingMessageConverter implements MessageConverter { this(converter, null); } + /** + * Create a HeaderMappingMessageConverter instance that will delegate to + * the provided {@link JmsHeaderMapper} instance and will use the default + * {@link SimpleMessageConverter} implementation. + */ + public HeaderMappingMessageConverter(JmsHeaderMapper headerMapper) { + this(null, headerMapper); + } + /** * Create a HeaderMappingMessageConverter instance that will delegate to * the provided {@link MessageConverter} and {@link JmsHeaderMapper}. */ public HeaderMappingMessageConverter(MessageConverter converter, JmsHeaderMapper headerMapper) { - this.converter = converter; + this.converter = (converter != null ? converter : new SimpleMessageConverter()); this.headerMapper = (headerMapper != null ? headerMapper : new DefaultJmsHeaderMapper()); } + /** + * Specify whether the inbound JMS Message's payload should be extracted + * during the conversion process. Otherwise, the raw JMS Message itself + * will be the payload of the created Spring Integration Message. The + * HeaderMapper will be applied to the Message regardless of this value. + * + *
The default value is true.
+ */
+ public void setExtractRequestPayload(boolean extractRequestPayload) {
+ this.extractRequestPayload = extractRequestPayload;
+ }
/**
- * Specify whether the integration Message's payload should be extracted
- * prior to conversion. Otherwise, the integration Message itself will be
- * passed to the converter.
- *
- *
If no {@link MessageConverter} is available (the default), the - * integration Message will be sent within a JMS {@link ObjectMessage}. + * Specify whether the outbound integration Message's payload should be + * extracted prior to conversion into a JMS Message. Otherwise, the + * integration Message itself will be passed to the converter. * *
Typically, this setting should be determined by the expectations of
* the target system. If the target system is not capable of understanding
- * a Spring Integration Message, then set this to true.
+ * a Spring Integration Message, then set this to true.
* On the other hand, if the system is not only capable of understanding a
- * Spring Integration Message but actually expected to rely upon header
- * values, then this must be set to false so that the actual
- * Message along with its headers will be passed.
+ * Spring Integration Message but actually expected to rely upon Spring
+ * Integration Message Header values, then this must be set to
+ * false to ensure that the actual Message will be passed
+ * along with its Serializable headers.
*
- *
The default value is false.
+ *
The default value is This property will be ignored if a {@link MessageConverter} is
+ * provided to the {@link #setMessageConverter(MessageConverter)} method.
+ * However, you may provide your own implementation of the delegating
+ * {@link HeaderMappingMessageConverter} implementation.
+ */
+ public void setHeaderMapper(JmsHeaderMapper headerMapper) {
+ this.headerMapper = headerMapper;
+ }
+
+ public void setExtractRequestPayload(boolean extractRequestPayload) {
+ this.extractRequestPayload = extractRequestPayload;
+ }
+
+ public void setExtractReplyPayload(boolean extractReplyPayload) {
+ this.extractReplyPayload = extractReplyPayload;
+ }
+
public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
@@ -124,21 +156,15 @@ public class JmsInboundGateway extends SimpleMessagingGateway implements Disposa
this.idleTaskExecutionLimit = idleTaskExecutionLimit;
}
- public void setExtractPayloadForReply(boolean extractPayloadForReply) {
- this.extractPayloadForReply = extractPayloadForReply;
- }
-
private void initialize() {
if (this.container == null) {
this.container = createDefaultContainer();
}
if (this.messageConverter == null) {
- this.messageConverter = new SimpleMessageConverter();
- }
- if (!(this.messageConverter instanceof HeaderMappingMessageConverter)) {
- HeaderMappingMessageConverter hmmc = new HeaderMappingMessageConverter(this.messageConverter);
- hmmc.setExtractPayload(this.extractPayloadForReply);
+ HeaderMappingMessageConverter hmmc = new HeaderMappingMessageConverter(null, this.headerMapper);
+ hmmc.setExtractRequestPayload(this.extractRequestPayload);
+ hmmc.setExtractReplyPayload(this.extractReplyPayload);
this.messageConverter = hmmc;
}
MessageListenerAdapter listener = new MessageListenerAdapter();
diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundGatewayParser.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundGatewayParser.java
index d99dee806b..833676767a 100644
--- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundGatewayParser.java
+++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/config/JmsInboundGatewayParser.java
@@ -87,9 +87,10 @@ public class JmsInboundGatewayParser extends AbstractSingleBeanDefinitionParser
builder.addPropertyValue("sessionAcknowledgeMode", acknowledgeMode);
}
}
- if ("true".equals(element.getAttribute("extract-payload-for-reply"))) {
- builder.addPropertyValue("extractPayloadForReply", Boolean.TRUE);
- }
+ IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter");
+ IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "header-mapper");
+ IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-request-payload");
+ IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-reply-payload");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "transaction-manager");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "request-channel");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "request-timeout");
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 8ac91bd4ca..19002066bd 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
@@ -47,11 +47,13 @@
true.
*/
- public void setExtractPayload(boolean extractPayload) {
- this.extractPayload = extractPayload;
+ public void setExtractReplyPayload(boolean extractReplyPayload) {
+ this.extractReplyPayload = extractReplyPayload;
}
/**
@@ -115,10 +132,7 @@ public class HeaderMappingMessageConverter implements MessageConverter {
*/
public Object fromMessage(javax.jms.Message jmsMessage) throws JMSException, MessageConversionException {
MessageBuilder> builder = null;
- if (this.converter == null) {
- builder = MessageBuilder.withPayload(jmsMessage);
- }
- else {
+ if (this.extractRequestPayload) {
Object conversionResult = this.converter.fromMessage(jmsMessage);
if (conversionResult == null) {
return null;
@@ -130,6 +144,9 @@ public class HeaderMappingMessageConverter implements MessageConverter {
builder = MessageBuilder.withPayload(conversionResult);
}
}
+ else {
+ builder = MessageBuilder.withPayload(jmsMessage);
+ }
Map