Refactored JmsGateway and HeaderMappingMessageConverter (related to INT-240, INT-355, and INT-376).

This commit is contained in:
Mark Fisher
2008-10-17 17:43:59 +00:00
parent be4139c759
commit e7a1140003
14 changed files with 188 additions and 101 deletions

View File

@@ -20,7 +20,6 @@ import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.util.Assert;
@@ -40,7 +39,7 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea
private volatile JmsTemplate jmsTemplate;
private volatile MessageHeaderMapper<javax.jms.Message> headerMapper;
private volatile JmsHeaderMapper headerMapper;
private volatile boolean initialized;
@@ -87,7 +86,7 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea
this.jmsTemplate = jmsTemplate;
}
public void setHeaderMapper(MessageHeaderMapper<javax.jms.Message> headerMapper) {
public void setHeaderMapper(JmsHeaderMapper headerMapper) {
this.headerMapper = headerMapper;
}

View File

@@ -28,16 +28,15 @@ import javax.jms.Destination;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.integration.core.MessageHeaders;
import org.springframework.util.StringUtils;
/**
* A {@link HeaderMapper} implementation for JMS {@link javax.jms.Message Messages}.
* Default implementation of {@link JmsHeaderMapper}.
*
* @author Mark Fisher
*/
public class DefaultJmsHeaderMapper implements MessageHeaderMapper<javax.jms.Message> {
public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
private static List<Class<?>> SUPPORTED_PROPERTY_TYPES = Arrays.asList(new Class<?>[] {
Boolean.class, Byte.class, Double.class, Float.class, Integer.class, Long.class, Short.class, String.class });
@@ -46,7 +45,7 @@ public class DefaultJmsHeaderMapper implements MessageHeaderMapper<javax.jms.Mes
private final Log logger = LogFactory.getLog(this.getClass());
public void mapFromMessageHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) {
public void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) {
try {
Object jmsCorrelationId = headers.get(JmsHeaders.CORRELATION_ID);
if (jmsCorrelationId != null && (jmsCorrelationId instanceof String)) {
@@ -88,7 +87,7 @@ public class DefaultJmsHeaderMapper implements MessageHeaderMapper<javax.jms.Mes
}
}
public Map<String, Object> mapToMessageHeaders(javax.jms.Message jmsMessage) {
public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) {
Map<String, Object> headers = new HashMap<String, Object>();
try {
String correlationId = jmsMessage.getJMSCorrelationID();

View File

@@ -16,25 +16,36 @@
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;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.integration.core.Message;
import org.springframework.integration.core.MessagingException;
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.jms.support.converter.SimpleMessageConverter;
import org.springframework.util.Assert;
/**
* A {@link MessageConverter} implementation that delegates to an existing
* converter as well as an implementation of {@link MessageHeaderMapper}.
* A {@link MessageConverter} implementation that is capable of delegating to
* an existing converter instance and an existing {@link JmsHeaderMapper}. The
* default header mapper implementation is {@link DefaultJmsHeaderMapper}.
* No MessageConverter will be created by default. Unless a converter is
* provided, each inbound JMS Message will become the payload of an integration
* Message, and each outbound integration Message will become the body of a JMS
* Message.
*
* <p>Even without specifying a converter, it is possible to have the
* integration Message payload Object passed instead. Simply set the
* {@link #setExtractPayload(boolean) extractPayload} property to
* <code>true</code>.
*
* @author Mark Fisher
*/
@@ -44,39 +55,113 @@ public class HeaderMappingMessageConverter implements MessageConverter {
private final MessageConverter converter;
private final MessageHeaderMapper<javax.jms.Message> headerMapper;
private final JmsHeaderMapper headerMapper;
private volatile boolean extractPayload;
/**
* Create a HeaderMappingMessageConverter instance that will <em>not</em>
* delegate to another {@link MessageConverter} and will use the default
* implementation of the {@link JmsHeaderMapper} strategy.
*/
public HeaderMappingMessageConverter() {
this(null, null);
}
/**
* Create a HeaderMappingMessageConverter instance that will delegate to
* the provided {@link MessageConverter} instance and will use the default
* implementation of the {@link JmsHeaderMapper} strategy.
*/
public HeaderMappingMessageConverter(MessageConverter converter) {
this(converter, null);
}
public HeaderMappingMessageConverter(MessageConverter converter, MessageHeaderMapper<javax.jms.Message> headerMapper) {
this.converter = (converter != null ? converter : new SimpleMessageConverter());
/**
* 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.headerMapper = (headerMapper != null ? headerMapper : new DefaultJmsHeaderMapper());
}
/**
* Specify whether the integration Message's payload should be extracted
* prior to conversion. Otherwise, the integration Message itself will be
* passed to the converter.
*
* <p>If no {@link MessageConverter} is available (the default), the
* integration Message will be sent within a JMS {@link ObjectMessage}.
*
* <p>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 <code>true</code>.
* 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 <code>false</code> so that the actual
* Message along with its headers will be passed.
*
* <p>The default value is <code>false</code>.
*/
public void setExtractPayload(boolean extractPayload) {
this.extractPayload = extractPayload;
}
/**
* Converts from a JMS {@link javax.jms.Message} to an integration Message.
*/
public Object fromMessage(javax.jms.Message jmsMessage) throws JMSException, MessageConversionException {
Object payload = this.converter.fromMessage(jmsMessage);
Map<String, Object> headerMap = this.headerMapper.mapToMessageHeaders(jmsMessage);
Message<?> message = MessageBuilder.withPayload(payload).copyHeaders(headerMap).build();
MessageBuilder<?> builder = null;
if (this.converter == null) {
builder = MessageBuilder.withPayload(jmsMessage);
}
else {
Object conversionResult = this.converter.fromMessage(jmsMessage);
if (conversionResult == null) {
return null;
}
if (conversionResult instanceof Message) {
builder = MessageBuilder.fromMessage((Message<?>) conversionResult);
}
else {
builder = MessageBuilder.withPayload(conversionResult);
}
}
Map<String, Object> headers = this.headerMapper.toHeaders(jmsMessage);
Message<?> message = builder.copyHeadersIfAbsent(headers).build();
if (logger.isDebugEnabled()) {
logger.debug("converted JMS Message [" + jmsMessage + "] to integration Message [" + message + "]");
}
return message;
}
/**
* Converts from an integration Message to a JMS {@link javax.jms.Message}.
*/
public javax.jms.Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
if (!(object instanceof Message<?>)) {
throw new MessagingException("expected a '" + Message.class.getName() +
"', but received '" + object.getClass() + "'");
MessageHeaders headers = null;
javax.jms.Message jmsMessage = null;
if (object instanceof Message) {
headers = ((Message<?>) object).getHeaders();
if (this.extractPayload) {
object = ((Message<?>) object).getPayload();
}
}
if (this.converter == null) {
Assert.isInstanceOf(Serializable.class, object, "Object must implement Serializable");
jmsMessage = session.createObjectMessage((Serializable) object);
}
else {
jmsMessage = this.converter.toMessage(object, session);
}
if (headers != null) {
this.headerMapper.fromHeaders(headers, jmsMessage);
}
Message<?> message = (Message<?>) object;
javax.jms.Message jmsMessage = this.converter.toMessage(message.getPayload(), session);
this.headerMapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
if (logger.isDebugEnabled()) {
logger.debug("converted integration Message [" + message + "] to JMS Message [" + jmsMessage + "]");
logger.debug("converted [" + object + "] to JMS Message [" + jmsMessage + "]");
}
return jmsMessage;
}

View File

@@ -18,14 +18,18 @@ package org.springframework.integration.jms;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.Lifecycle;
import org.springframework.core.task.TaskExecutor;
import org.springframework.integration.core.Message;
import org.springframework.integration.gateway.SimpleMessagingGateway;
import org.springframework.jms.listener.AbstractMessageListenerContainer;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.listener.SessionAwareMessageListener;
import org.springframework.jms.listener.adapter.MessageListenerAdapter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.SimpleMessageConverter;
@@ -65,7 +69,7 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis
private volatile int idleTaskExecutionLimit = 1;
private boolean expectReply = false;
private volatile boolean extractPayloadForReply = false;
public void setContainer(AbstractMessageListenerContainer container) {
@@ -105,10 +109,6 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis
this.sessionAcknowledgeMode = sessionAcknowledgeMode;
}
public void setExpectReply(boolean expectReply) {
this.expectReply = expectReply;
}
public void setConcurrentConsumers(int concurrentConsumers) {
this.concurrentConsumers = concurrentConsumers;
}
@@ -125,19 +125,35 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis
this.idleTaskExecutionLimit = idleTaskExecutionLimit;
}
public void setExtractPayloadForReply(boolean extractPayloadForReply) {
this.extractPayloadForReply = extractPayloadForReply;
}
private void initialize() {
if (this.container == null) {
this.container = createDefaultContainer();
}
MessageListenerAdapter listener = new MessageListenerAdapter();
listener.setDelegate(this);
listener.setDefaultListenerMethod(this.expectReply ? "sendAndReceive" : "send");
if (this.messageConverter == null) {
this.messageConverter = new SimpleMessageConverter();
}
if (!(this.messageConverter instanceof HeaderMappingMessageConverter)) {
this.messageConverter = new HeaderMappingMessageConverter(this.messageConverter);
HeaderMappingMessageConverter hmmc = new HeaderMappingMessageConverter(this.messageConverter);
hmmc.setExtractPayload(this.extractPayloadForReply);
this.messageConverter = hmmc;
}
MessageListenerAdapter listener = new MessageListenerAdapter();
listener.setDelegate(new SessionAwareMessageListener() {
public void onMessage(javax.jms.Message jmsMessage, Session session) throws JMSException {
Object object = messageConverter.fromMessage(jmsMessage);
Message<?> replyMessage = JmsGateway.this.sendAndReceiveMessage(object);
if (replyMessage != null) {
javax.jms.Message jmsReply = messageConverter.toMessage(replyMessage, session);
MessageProducer producer = session.createProducer(jmsMessage.getJMSReplyTo());
producer.send(jmsMessage.getJMSReplyTo(), jmsReply);
}
}
});
listener.setMessageConverter(this.messageConverter);
this.container.setMessageListener(listener);
if (!this.container.isActive()) {
@@ -172,6 +188,8 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis
return dmlc;
}
// Lifecycle implementation
public boolean isRunning() {
return (this.container != null && this.container.isRunning());
}
@@ -187,6 +205,8 @@ public class JmsGateway extends SimpleMessagingGateway implements Lifecycle, Dis
}
}
// DisposableBean implementation
public void destroy() {
if (this.container != null) {
this.container.destroy();

View File

@@ -0,0 +1,36 @@
/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.jms;
import java.util.Map;
import org.springframework.integration.core.MessageHeaders;
/**
* Strategy interface for mapping integration Message headers to an outbound
* JMS Message (e.g. to configure JMS properties) or extracting integration
* header values from an inbound JMS Message.
*
* @author Mark Fisher
*/
public interface JmsHeaderMapper {
void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage);
Map<String, Object> toHeaders(javax.jms.Message jmsMessage);
}

View File

@@ -29,7 +29,7 @@ import org.springframework.integration.jms.JmsGateway;
import org.springframework.util.StringUtils;
/**
* Parser for the &lt;jms-gateway&gt; element.
* Parser for the &lt;inbound-gateway&gt; element of the 'jms' integration namespace.
*
* @author Mark Fisher
*/
@@ -87,29 +87,14 @@ public class JmsGatewayParser extends AbstractSingleBeanDefinitionParser {
builder.addPropertyValue("sessionAcknowledgeMode", acknowledgeMode);
}
}
String transactionManager = element.getAttribute("transaction-manager");
if (StringUtils.hasText(transactionManager)) {
builder.addPropertyReference("transactionManager", transactionManager);
}
String requestChannel = element.getAttribute("request-channel");
if (StringUtils.hasText(requestChannel)) {
builder.addPropertyReference("requestChannel", requestChannel);
}
String requestTimeout = element.getAttribute("request-timeout");
if (StringUtils.hasText(requestTimeout)) {
builder.addPropertyValue("requestTimeout", Long.parseLong(requestTimeout));
}
String replyChannel = element.getAttribute("reply-channel");
if (StringUtils.hasText(replyChannel)) {
builder.addPropertyReference("replyChannel", replyChannel);
}
String replyTimeout = element.getAttribute("reply-timeout");
if (StringUtils.hasText(replyTimeout)) {
builder.addPropertyValue("replyTimeout", Long.parseLong(replyTimeout));
}
if ("true".equals(element.getAttribute("expect-reply"))) {
builder.addPropertyValue("expectReply", Boolean.TRUE);
if ("true".equals(element.getAttribute("extract-payload-for-reply"))) {
builder.addPropertyValue("extractPayloadForReply", Boolean.TRUE);
}
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "transaction-manager");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "request-channel");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "request-timeout");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "reply-channel");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "reply-timeout");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "concurrent-consumers");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "max-concurrent-consumers");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "max-messages-per-task");

View File

@@ -47,11 +47,11 @@
<xsd:complexContent>
<xsd:extension base="jmsInboundAdapterType">
<xsd:attribute name="message-converter" type="xsd:string"/>
<xsd:attribute name="expect-reply" type="xsd:boolean" default="false"/>
<xsd:attribute name="request-channel" type="xsd:string" use="required"/>
<xsd:attribute name="reply-channel" type="xsd:string"/>
<xsd:attribute name="request-timeout" type="xsd:long"/>
<xsd:attribute name="reply-timeout" type="xsd:long"/>
<xsd:attribute name="extract-payload-for-reply" type="xsd:boolean" default="false"/>
<xsd:attribute name="transaction-manager" type="xsd:string"/>
<xsd:attribute name="concurrent-consumers" type="xsd:string"/>
<xsd:attribute name="max-concurrent-consumers" type="xsd:string"/>

View File

@@ -45,7 +45,7 @@ public class DefaultJmsHeaderMapperTests {
.setHeader(JmsHeaders.REPLY_TO, replyTo).build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNotNull(jmsMessage.getJMSReplyTo());
assertSame(replyTo, jmsMessage.getJMSReplyTo());
}
@@ -56,7 +56,7 @@ public class DefaultJmsHeaderMapperTests {
.setHeader(JmsHeaders.REPLY_TO, "not-a-destination").build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSReplyTo());
}
@@ -67,7 +67,7 @@ public class DefaultJmsHeaderMapperTests {
.setHeader(JmsHeaders.CORRELATION_ID, jmsCorrelationId).build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNotNull(jmsMessage.getJMSCorrelationID());
assertEquals(jmsCorrelationId, jmsMessage.getJMSCorrelationID());
}
@@ -78,7 +78,7 @@ public class DefaultJmsHeaderMapperTests {
.setHeader(JmsHeaders.CORRELATION_ID, new Integer(123)).build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSCorrelationID());
}
@@ -89,7 +89,7 @@ public class DefaultJmsHeaderMapperTests {
.setHeader(JmsHeaders.TYPE, jmsType).build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNotNull(jmsMessage.getJMSType());
assertEquals(jmsType, jmsMessage.getJMSType());
}
@@ -100,7 +100,7 @@ public class DefaultJmsHeaderMapperTests {
.setHeader(JmsHeaders.TYPE, new Integer(123)).build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSType());
}
@@ -111,7 +111,7 @@ public class DefaultJmsHeaderMapperTests {
.build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
Object value = jmsMessage.getObjectProperty("foo");
assertNotNull(value);
assertEquals(Integer.class, value.getClass());
@@ -126,7 +126,7 @@ public class DefaultJmsHeaderMapperTests {
.build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage();
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
Object value = jmsMessage.getObjectProperty("foo");
assertNull(value);
}
@@ -137,7 +137,7 @@ public class DefaultJmsHeaderMapperTests {
javax.jms.Message jmsMessage = new StubTextMessage();
jmsMessage.setJMSReplyTo(replyTo);
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
Map<String, Object> headers = mapper.mapToMessageHeaders(jmsMessage);
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
Object attrib = headers.get(JmsHeaders.REPLY_TO);
assertNotNull(attrib);
assertSame(replyTo, attrib);
@@ -149,7 +149,7 @@ public class DefaultJmsHeaderMapperTests {
javax.jms.Message jmsMessage = new StubTextMessage();
jmsMessage.setJMSCorrelationID(correlationId);
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
Map<String, Object> headers = mapper.mapToMessageHeaders(jmsMessage);
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
Object attrib = headers.get(JmsHeaders.CORRELATION_ID);
assertNotNull(attrib);
assertSame(correlationId, attrib);
@@ -161,7 +161,7 @@ public class DefaultJmsHeaderMapperTests {
javax.jms.Message jmsMessage = new StubTextMessage();
jmsMessage.setJMSType(type);
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
Map<String, Object> headers = mapper.mapToMessageHeaders(jmsMessage);
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
Object attrib = headers.get(JmsHeaders.TYPE);
assertNotNull(attrib);
assertSame(type, attrib);
@@ -172,7 +172,7 @@ public class DefaultJmsHeaderMapperTests {
javax.jms.Message jmsMessage = new StubTextMessage();
jmsMessage.setIntProperty("foo", 123);
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
Map<String, Object> headers = mapper.mapToMessageHeaders(jmsMessage);
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
Object attrib = headers.get(JmsHeaders.USER_PREFIX + "foo");
assertNotNull(attrib);
assertEquals(Integer.class, attrib.getClass());
@@ -196,7 +196,7 @@ public class DefaultJmsHeaderMapperTests {
super.setObjectProperty(name, value);
}
};
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
Object foo = jmsMessage.getObjectProperty("foo");
assertNotNull(foo);
Object bar = jmsMessage.getObjectProperty("bar");
@@ -222,7 +222,7 @@ public class DefaultJmsHeaderMapperTests {
super.setObjectProperty(name, value);
}
};
mapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
mapper.fromHeaders(message.getHeaders(), jmsMessage);
Object foo = jmsMessage.getObjectProperty("foo");
assertNotNull(foo);
Object bar = jmsMessage.getObjectProperty("bar");

View File

@@ -80,30 +80,30 @@ public class JmsGatewayParserTests {
}
@Test
public void testGatewayWithDefaultExpectReply() {
public void testGatewayWithDefaultExtractPayload() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"jmsGatewaysWithExpectReplyAttributes.xml", this.getClass());
"jmsGatewaysWithExtractPayloadAttributes.xml", this.getClass());
JmsGateway gateway = (JmsGateway) context.getBean("defaultGateway");
DirectFieldAccessor accessor = new DirectFieldAccessor(gateway);
assertEquals(Boolean.FALSE, accessor.getPropertyValue("expectReply"));
assertEquals(Boolean.FALSE, accessor.getPropertyValue("extractPayloadForReply"));
}
@Test
public void testGatewayExpectingReply() {
public void testGatewayWithExtractPayloadTrue() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"jmsGatewaysWithExpectReplyAttributes.xml", this.getClass());
"jmsGatewaysWithExtractPayloadAttributes.xml", this.getClass());
JmsGateway gateway = (JmsGateway) context.getBean("gatewayExpectingReply");
DirectFieldAccessor accessor = new DirectFieldAccessor(gateway);
assertEquals(Boolean.TRUE, accessor.getPropertyValue("expectReply"));
assertEquals(Boolean.TRUE, accessor.getPropertyValue("extractPayloadForReply"));
}
@Test
public void testGatewayNotExpectingReply() {
public void testGatewayWithExtractPayloadFalse() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"jmsGatewaysWithExpectReplyAttributes.xml", this.getClass());
"jmsGatewaysWithExtractPayloadAttributes.xml", this.getClass());
JmsGateway gateway = (JmsGateway) context.getBean("gatewayNotExpectingReply");
DirectFieldAccessor accessor = new DirectFieldAccessor(gateway);
assertEquals(Boolean.FALSE, accessor.getPropertyValue("expectReply"));
assertEquals(Boolean.FALSE, accessor.getPropertyValue("extractPayloadForReply"));
}
@Test(expected=BeanDefinitionStoreException.class)

View File

@@ -25,8 +25,8 @@ import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.integration.endpoint.SubscribingConsumerEndpoint;
import org.springframework.integration.jms.JmsHeaderMapper;
/**
* @author Mark Fisher
@@ -64,17 +64,15 @@ public class JmsOutboundChannelAdapterParserTests {
}
@Test
@SuppressWarnings("unchecked")
public void adapterWithHeaderMapper() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"jmsOutboundWithHeaderMapper.xml", this.getClass());
SubscribingConsumerEndpoint endpoint = (SubscribingConsumerEndpoint) context.getBean("adapter");
DirectFieldAccessor accessor = new DirectFieldAccessor(
new DirectFieldAccessor(endpoint).getPropertyValue("consumer"));
MessageHeaderMapper headerMapper = (MessageHeaderMapper)
accessor.getPropertyValue("headerMapper");
JmsHeaderMapper headerMapper = (JmsHeaderMapper) accessor.getPropertyValue("headerMapper");
assertNotNull(headerMapper);
assertEquals(TestMessageHeaderMapper.class, headerMapper.getClass());
assertEquals(TestJmsHeaderMapper.class, headerMapper.getClass());
}
@Test(expected = BeanDefinitionStoreException.class)

View File

@@ -21,18 +21,18 @@ import java.util.Map;
import javax.jms.Message;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.integration.core.MessageHeaders;
import org.springframework.integration.jms.JmsHeaderMapper;
/**
* @author Mark Fisher
*/
public class TestMessageHeaderMapper implements MessageHeaderMapper<Message> {
public class TestJmsHeaderMapper implements JmsHeaderMapper {
public void mapFromMessageHeaders(MessageHeaders headers, Message target) {
public void fromHeaders(MessageHeaders headers, Message target) {
}
public Map<String, Object> mapToMessageHeaders(Message source) {
public Map<String, Object> toHeaders(Message source) {
Map<String, Object> headerMap = new HashMap<String, Object>();
headerMap.put("testProperty", "foo");
headerMap.put("testAttribute", new Integer(123));

View File

@@ -23,12 +23,12 @@
<jms:inbound-gateway id="gatewayNotExpectingReply"
destination="testDestination"
request-channel="requestChannel"
expect-reply="false"/>
extract-payload-for-reply="false"/>
<jms:inbound-gateway id="gatewayExpectingReply"
destination="testDestination"
request-channel="requestChannel"
expect-reply="true"/>
extract-payload-for-reply="true"/>
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<constructor-arg>

View File

@@ -18,7 +18,7 @@
<integration:queue capacity="1"/>
</integration:channel>
<bean id="mapper" class="org.springframework.integration.jms.config.TestMessageHeaderMapper"/>
<bean id="mapper" class="org.springframework.integration.jms.config.TestJmsHeaderMapper"/>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>

View File

@@ -17,7 +17,7 @@
destination="testDestination"
header-mapper="mapper"/>
<bean id="mapper" class="org.springframework.integration.jms.config.TestMessageHeaderMapper"/>
<bean id="mapper" class="org.springframework.integration.jms.config.TestJmsHeaderMapper"/>
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<constructor-arg>