INT-1363 separating Destination/destinationName from JmsTemplate configuration

This commit is contained in:
Mark Fisher
2010-09-13 16:50:46 -04:00
parent aae01dc3d5
commit 01cf5cfc18
5 changed files with 69 additions and 22 deletions

View File

@@ -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) {

View File

@@ -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;
}
}
}

View File

@@ -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)) {

View File

@@ -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();
}

View File

@@ -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());
}