INT-1363 separating Destination/destinationName from JmsTemplate configuration
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user