INT-1203 JMS outbound-channel-adapter now properly configures the "message-converter" reference

This commit is contained in:
Mark Fisher
2010-06-24 17:19:34 +00:00
parent 1a617b1281
commit 242370550c
5 changed files with 63 additions and 13 deletions

View File

@@ -22,6 +22,8 @@ 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.jms.support.converter.SimpleMessageConverter;
import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.util.Assert;
@@ -52,6 +54,8 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea
private volatile JmsTemplate jmsTemplate;
private volatile MessageConverter messageConverter;
private volatile JmsHeaderMapper headerMapper;
private volatile boolean initialized;
@@ -97,12 +101,19 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea
this.pubSubDomain = pubSubDomain;
}
public void setDestinationResolver(DestinationResolver destinationResolver) {
this.destinationResolver = destinationResolver;
/**
* Provide a {@link MessageConverter} strategy to use for converting
* between Spring Integration Messages and JMS Messages.
* <p>
* The default is a {@link HeaderMappingMessageConverter} that delegates to
* a {@link SimpleMessageConverter}.
*/
public void setMessageConverter(MessageConverter messageConverter) {
this.messageConverter = messageConverter;
}
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
public void setDestinationResolver(DestinationResolver destinationResolver) {
this.destinationResolver = destinationResolver;
}
public void setHeaderMapper(JmsHeaderMapper headerMapper) {
@@ -168,6 +179,9 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea
this.jmsTemplate.setTimeToLive(this.timeToLive);
this.jmsTemplate.setPriority(this.priority);
this.jmsTemplate.setDeliveryMode(this.deliveryMode);
if (this.messageConverter != null) {
this.jmsTemplate.setMessageConverter(this.messageConverter);
}
this.configureMessageConverter(this.jmsTemplate, this.headerMapper);
this.initialized = true;
}

View File

@@ -60,15 +60,6 @@ public class JmsDestinationPollingSource extends AbstractJmsTemplateBasedAdapter
this.messageSelector = messageSelector;
}
/**
* Specify a MessageConverter to use when mapping from JMS Mesages to
* Spring Integration Messages. If it is not itself an implementation
* of {@link HeaderMappingMessageConverter}, it will be wrapped.
*/
public void setMessageConverter(MessageConverter messageConverter) {
this.getJmsTemplate().setMessageConverter(messageConverter);
}
/**
* Specify whether the payload should be extracted from each received JMS
* Message to be used as the Spring Integration Message payload.

View File

@@ -70,6 +70,7 @@ public class JmsOutboundChannelAdapterParser extends AbstractOutboundChannelAdap
if (StringUtils.hasText(headerMapper)) {
builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper);
}
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "time-to-live");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "priority");

View File

@@ -29,6 +29,7 @@ import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.endpoint.EventDrivenConsumer;
import org.springframework.integration.jms.JmsHeaderMapper;
import org.springframework.jms.support.converter.MessageConverter;
/**
* @author Mark Fisher
@@ -88,6 +89,17 @@ public class JmsOutboundChannelAdapterParserTests {
assertEquals(TestJmsHeaderMapper.class, headerMapper.getClass());
}
@Test
public void adapterWithMessageConverter() {
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");
assertNotNull(messageConverter);
assertEquals(TestMessageConverter.class, messageConverter.getClass());
}
@Test(expected = BeanDefinitionStoreException.class)
public void adapterWithEmptyConnectionFactory() {
try {

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:integration="http://www.springframework.org/schema/integration"
xmlns:jms="http://www.springframework.org/schema/integration/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/jms
http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd">
<integration:channel id="input"/>
<jms:outbound-channel-adapter id="adapter"
channel="input"
destination="testDestination"
message-converter="converter"/>
<bean id="converter" class="org.springframework.integration.jms.config.TestMessageConverter"/>
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<constructor-arg>
<bean class="org.springframework.integration.jms.StubConnection">
<constructor-arg value="target-test"/>
</bean>
</constructor-arg>
</bean>
<bean id="testDestination" class="org.springframework.integration.jms.StubDestination"/>
</beans>