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 3af9dc8b35..1479f15991 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 @@ -35,8 +35,6 @@ import org.springframework.util.Assert; */ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectSupport { - private volatile boolean extractPayload = true; - private volatile ConnectionFactory connectionFactory; private volatile Destination destination; @@ -87,18 +85,7 @@ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectS public 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 void setConnectionFactory(ConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } @@ -228,8 +215,4 @@ public abstract class AbstractJmsTemplateBasedAdapter extends IntegrationObjectS return jmsTemplate; } - protected boolean shouldExtractPayload() { - return extractPayload; - } - } 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 12cdb3616e..3c1fe617a5 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 @@ -19,13 +19,11 @@ package org.springframework.integration.jms; import javax.jms.Destination; import javax.jms.JMSException; -import org.springframework.core.Ordered; import org.springframework.integration.Message; -import org.springframework.integration.core.MessageHandler; -import org.springframework.integration.history.MessageHistory; -import org.springframework.integration.history.TrackableComponent; +import org.springframework.integration.handler.AbstractMessageHandler; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessagePostProcessor; +import org.springframework.util.Assert; /** * A MessageConsumer that sends the converted Message payload within a JMS Message. @@ -33,63 +31,68 @@ import org.springframework.jms.core.MessagePostProcessor; * @author Mark Fisher * @author Oleg Zhurakousky */ -public class JmsSendingMessageHandler extends AbstractJmsTemplateBasedAdapter implements MessageHandler, TrackableComponent, Ordered { +public class JmsSendingMessageHandler extends AbstractMessageHandler { - private volatile int order = Ordered.LOWEST_PRECEDENCE; + private final JmsTemplate jmsTemplate; - private volatile boolean shouldTrack; + private volatile Destination destination; + + private volatile String destinationName; + + private volatile JmsHeaderMapper headerMapper = new DefaultJmsHeaderMapper(); + + private volatile boolean extractPayload = true; public JmsSendingMessageHandler(JmsTemplate jmsTemplate) { - super(jmsTemplate); + this.jmsTemplate = jmsTemplate; + } + + public void setDestination(Destination destination) { + Assert.isNull(this.destinationName, "The 'destination' and 'destinationName' properties are mutually exclusive."); + this.destination = destination; + } + + public void setDestinationName(String destinationName) { + Assert.isNull(this.destination, "The 'destination' and 'destinationName' properties are mutually exclusive."); + this.destinationName = destinationName; + } + + public void setHeaderMapper(JmsHeaderMapper headerMapper) { + this.headerMapper = headerMapper; } /** - * No-arg constructor provided for convenience when configuring with - * setters. Note that the initialization callback will validate. + * Specify whether the payload should be extracted from each integration + * Message to be used as the JMS Message body. + * + *

The default value is true. To force passing of the full + * Spring Integration Message instead, set this to false. */ - public JmsSendingMessageHandler() { - super(); - } - - public void setShouldTrack(boolean shouldTrack) { - this.shouldTrack = shouldTrack; + public void setExtractPayload(boolean extractPayload) { + this.extractPayload = extractPayload; } + @Override public String getComponentType() { return "jms:outbound-channel-adapter"; } - public void setOrder(int order) { - this.order = order; - } - - public int getOrder() { - return this.order; - } - - public final void handleMessage(Message message) { + @Override + protected void handleMessageInternal(final Message message) throws Exception { if (message == null) { throw new IllegalArgumentException("message must not be null"); } - final Message messageToSend = (this.shouldTrack) ? MessageHistory.write(message, this) : message; - Object objectToSend = messageToSend; - if (this.shouldExtractPayload()) { - objectToSend = messageToSend.getPayload(); + Object objectToSend = (this.extractPayload) ? message.getPayload() : message; + MessagePostProcessor messagePostProcessor = new HeaderMappingMessagePostProcessor(message, this.headerMapper); + if (this.destination != null) { + this.jmsTemplate.convertAndSend(this.destination, objectToSend, messagePostProcessor); } - MessagePostProcessor messagePostProcessor = new HeaderMappingMessagePostProcessor(messageToSend, this.getHeaderMapper()); - Destination destination = this.getDestination(); - if (destination != null) { - this.getJmsTemplate().convertAndSend(destination, objectToSend, messagePostProcessor); + else if (this.destinationName != null) { + this.jmsTemplate.convertAndSend(this.destinationName, 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); - } + else { // fallback to default destination of the template + this.jmsTemplate.convertAndSend(objectToSend, messagePostProcessor); } } @@ -111,4 +114,5 @@ public class JmsSendingMessageHandler extends AbstractJmsTemplateBasedAdapter im } } + } 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 757ada7496..344d10f9b1 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 @@ -55,8 +55,10 @@ abstract class JmsAdapterParserUtils { static final String HEADER_MAPPER_PROPERTY = "headerMapper"; - private static final String[] JMS_TEMPLATE_ATTRIBUTES = { "destination", "destination-name", - "connection-factory", "message-converter", "destination-resolver", "time-to-live", "priority", "delivery-persistent", "explicit-qos-enabled" }; + private static final String[] JMS_TEMPLATE_ATTRIBUTES = { + "connection-factory", "message-converter", "destination-resolver", "pub-sub-domain", + "time-to-live", "priority", "delivery-persistent", "explicit-qos-enabled" + }; /* @@ -116,6 +118,7 @@ abstract class JmsAdapterParserUtils { JmsAdapterParserUtils.determineConnectionFactoryBeanName(element, parserContext)); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "destination-resolver"); + IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "pub-sub-domain"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "time-to-live"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "priority"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "delivery-persistent"); diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java index 3ba23c5e6b..efc5f599fd 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsInboundChannelAdapterParser.java @@ -90,7 +90,6 @@ public class JmsInboundChannelAdapterParser extends AbstractPollingInboundChanne } IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "selector", "messageSelector"); - IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload"); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "destination-resolver"); BeanDefinition beanDefinition = builder.getBeanDefinition(); String beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, parserContext.getRegistry());