INT-1229, INT-1241 JMS property to/from header mapping is no longer fatal and no longer skips other properties/headers when a JMS spec-defined property (e.g. ReplyTo) is not readable or writable in a particular environment.

This commit is contained in:
Mark Fisher
2010-07-19 18:17:32 +00:00
parent 20ef3cf050
commit 68d384e2d1
3 changed files with 271 additions and 39 deletions

View File

@@ -29,7 +29,6 @@ import javax.jms.JMSException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.adapter.MessageMappingException;
import org.springframework.integration.core.MessageHeaders;
import org.springframework.util.StringUtils;
@@ -67,16 +66,31 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
jmsCorrelationId = ((Number) jmsCorrelationId).toString();
}
if (jmsCorrelationId instanceof String) {
try {
jmsMessage.setJMSCorrelationID((String) jmsCorrelationId);
}
catch (Exception e) {
logger.info("failed to set JMSCorrelationID, skipping", e);
}
}
Object jmsReplyTo = headers.get(JmsHeaders.REPLY_TO);
if (jmsReplyTo instanceof Destination) {
try {
jmsMessage.setJMSReplyTo((Destination) jmsReplyTo);
}
catch (Exception e) {
logger.info("failed to set JMSReplyTo, skipping", e);
}
}
Object jmsType = headers.get(JmsHeaders.TYPE);
if (jmsType instanceof String) {
try {
jmsMessage.setJMSType((String) jmsType);
}
catch (Exception e) {
logger.info("failed to set JMSType, skipping", e);
}
}
Set<String> attributeNames = headers.keySet();
for (String attributeName : attributeNames) {
if (!attributeName.startsWith(JmsHeaders.PREFIX)) {
@@ -105,31 +119,56 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
}
catch (Exception e) {
if (logger.isWarnEnabled()) {
logger.warn("error occurred while mapping properties from MessageHeaders", e);
logger.warn("error occurred while mapping from MessageHeaders to JMS properties", e);
}
}
}
public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) {
Map<String, Object> headers = new HashMap<String, Object>();
try {
try {
String messageId = jmsMessage.getJMSMessageID();
if (messageId != null) {
headers.put(JmsHeaders.MESSAGE_ID, messageId);
}
}
catch (Exception e) {
logger.info("failed to read JMSMessageID property, skipping", e);
}
try {
String correlationId = jmsMessage.getJMSCorrelationID();
if (correlationId != null) {
headers.put(JmsHeaders.CORRELATION_ID, correlationId);
}
}
catch (Exception e) {
logger.info("failed to read JMSCorrelationID property, skipping", e);
}
try {
Destination replyTo = jmsMessage.getJMSReplyTo();
if (replyTo != null) {
headers.put(JmsHeaders.REPLY_TO, replyTo);
}
}
catch (Exception e) {
logger.info("failed to read JMSReplyTo property, skipping", e);
}
try {
headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered());
}
catch (Exception e) {
logger.info("failed to read JMSRedelivered property, skipping", e);
}
try {
String type = jmsMessage.getJMSType();
if (type != null) {
headers.put(JmsHeaders.TYPE, type);
}
}
catch (Exception e) {
logger.info("failed to read JMSType property, skipping", e);
}
Enumeration<?> jmsPropertyNames = jmsMessage.getPropertyNames();
if (jmsPropertyNames != null) {
while (jmsPropertyNames.hasMoreElements()) {
@@ -147,7 +186,9 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper {
}
}
catch (JMSException e) {
throw new MessageMappingException("failure occurred while mapping JMS properties to MessageHeaders", e);
if (logger.isWarnEnabled()) {
logger.warn("error occurred while mapping from JMS properties to MessageHeaders", e);
}
}
return headers;
}

View File

@@ -252,4 +252,160 @@ public class DefaultJmsHeaderMapperTests {
assertNull(bad);
}
@Test
public void attemptToWriteDisallowedReplyToPropertyIsNotFatal() throws JMSException {
Message<String> message = MessageBuilder.withPayload("test")
.setHeader(JmsHeaders.REPLY_TO, new StubDestination())
.setHeader("foo", "bar")
.build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public void setJMSReplyTo(Destination replyTo) throws JMSException {
throw new JMSException("illegal property");
}
};
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSReplyTo());
assertNotNull(jmsMessage.getStringProperty("foo"));
assertEquals("bar", jmsMessage.getStringProperty("foo"));
}
@Test
public void attemptToWriteDisallowedTypePropertyIsNotFatal() throws JMSException {
Message<String> message = MessageBuilder.withPayload("test")
.setHeader(JmsHeaders.TYPE, "someType")
.setHeader("foo", "bar")
.build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public void setJMSType(String type) throws JMSException {
throw new JMSException("illegal property");
}
};
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSType());
assertNotNull(jmsMessage.getStringProperty("foo"));
assertEquals("bar", jmsMessage.getStringProperty("foo"));
}
@Test
public void attemptToWriteDisallowedCorrelationIdStringPropertyIsNotFatal() throws JMSException {
Message<String> message = MessageBuilder.withPayload("test")
.setHeader(JmsHeaders.CORRELATION_ID, "abc")
.setHeader("foo", "bar")
.build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public void setJMSCorrelationID(String correlationId) throws JMSException {
throw new JMSException("illegal property");
}
};
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSCorrelationID());
assertNotNull(jmsMessage.getStringProperty("foo"));
assertEquals("bar", jmsMessage.getStringProperty("foo"));
}
@Test
public void attemptToWriteDisallowedCorrelationIdNumberPropertyIsNotFatal() throws JMSException {
Message<String> message = MessageBuilder.withPayload("test")
.setHeader(JmsHeaders.CORRELATION_ID, new Integer(123))
.setHeader("foo", "bar")
.build();
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public void setJMSCorrelationID(String correlationId) throws JMSException {
throw new JMSException("illegal property");
}
};
mapper.fromHeaders(message.getHeaders(), jmsMessage);
assertNull(jmsMessage.getJMSCorrelationID());
assertNotNull(jmsMessage.getStringProperty("foo"));
assertEquals("bar", jmsMessage.getStringProperty("foo"));
}
@Test
public void attemptToReadDisallowedMessageIdPropertyIsNotFatal() throws JMSException {
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public String getJMSMessageID() throws JMSException {
throw new JMSException("illegal property");
}
};
jmsMessage.setStringProperty("foo", "bar");
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
assertNull(headers.get(JmsHeaders.MESSAGE_ID));
assertNotNull(headers.get("foo"));
assertEquals("bar", headers.get("foo"));
}
@Test
public void attemptToReadDisallowedCorrelationIdPropertyIsNotFatal() throws JMSException {
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public String getJMSCorrelationID() throws JMSException {
throw new JMSException("illegal property");
}
};
jmsMessage.setStringProperty("foo", "bar");
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
assertNull(headers.get(JmsHeaders.CORRELATION_ID));
assertNotNull(headers.get("foo"));
assertEquals("bar", headers.get("foo"));
}
@Test
public void attemptToReadDisallowedTypePropertyIsNotFatal() throws JMSException {
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public String getJMSType() throws JMSException {
throw new JMSException("illegal property");
}
};
jmsMessage.setStringProperty("foo", "bar");
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
assertNull(headers.get(JmsHeaders.TYPE));
assertNotNull(headers.get("foo"));
assertEquals("bar", headers.get("foo"));
}
@Test
public void attemptToReadDisallowedReplyToPropertyIsNotFatal() throws JMSException {
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public Destination getJMSReplyTo() throws JMSException {
throw new JMSException("illegal property");
}
};
jmsMessage.setStringProperty("foo", "bar");
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
assertNull(headers.get(JmsHeaders.REPLY_TO));
assertNotNull(headers.get("foo"));
assertEquals("bar", headers.get("foo"));
}
@Test
public void attemptToReadDisallowedRedeliveredPropertyIsNotFatal() throws JMSException {
DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper();
javax.jms.Message jmsMessage = new StubTextMessage() {
@Override
public boolean getJMSRedelivered() throws JMSException {
throw new JMSException("illegal property");
}
};
jmsMessage.setStringProperty("foo", "bar");
Map<String, Object> headers = mapper.toHeaders(jmsMessage);
assertNull(headers.get(JmsHeaders.REDELIVERED));
assertNotNull(headers.get("foo"));
assertEquals("bar", headers.get("foo"));
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2010 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.
@@ -23,18 +23,35 @@ import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;
/**
* Stub JMS Message implementation intended for testing purposes only.
*
* @author Mark Fisher
*/
public class StubTextMessage implements TextMessage {
private String text;
private Destination replyTo;
private String messageId;
private String text;
private int deliveryMode = DEFAULT_DELIVERY_MODE;
private Destination destination;
private String correlationId;
private Destination replyTo;
private String type;
private long timestamp = 0L;
private long expiration = 0L;
private int priority = DEFAULT_PRIORITY;
private boolean redelivered;
private ConcurrentHashMap<String, Object> properties = new ConcurrentHashMap<String, Object>();
@@ -55,32 +72,40 @@ public class StubTextMessage implements TextMessage {
}
public void acknowledge() throws JMSException {
throw new UnsupportedOperationException();
}
public void clearBody() throws JMSException {
this.text = null;
}
public void clearProperties() throws JMSException {
this.properties.clear();
}
public boolean getBooleanProperty(String name) throws JMSException {
return false;
Object value = this.properties.get(name);
return (value instanceof Boolean) ? ((Boolean) value).booleanValue() : false;
}
public byte getByteProperty(String name) throws JMSException {
return 0;
Object value = this.properties.get(name);
return (value instanceof Byte) ? ((Byte) value).byteValue() : 0;
}
public double getDoubleProperty(String name) throws JMSException {
return 0;
Object value = this.properties.get(name);
return (value instanceof Double) ? ((Double) value).doubleValue() : 0;
}
public float getFloatProperty(String name) throws JMSException {
return 0;
Object value = this.properties.get(name);
return (value instanceof Float) ? ((Float) value).floatValue() : 0;
}
public int getIntProperty(String name) throws JMSException {
return 0;
Object value = this.properties.get(name);
return (value instanceof Integer) ? ((Integer) value).intValue() : 0;
}
public String getJMSCorrelationID() throws JMSException {
@@ -88,19 +113,19 @@ public class StubTextMessage implements TextMessage {
}
public byte[] getJMSCorrelationIDAsBytes() throws JMSException {
return null;
return this.correlationId.getBytes();
}
public int getJMSDeliveryMode() throws JMSException {
return 0;
return this.deliveryMode;
}
public Destination getJMSDestination() throws JMSException {
return null;
return this.destination;
}
public long getJMSExpiration() throws JMSException {
return 0;
return this.expiration;
}
public String getJMSMessageID() throws JMSException {
@@ -108,11 +133,11 @@ public class StubTextMessage implements TextMessage {
}
public int getJMSPriority() throws JMSException {
return 0;
return this.priority;
}
public boolean getJMSRedelivered() throws JMSException {
return false;
return this.redelivered;
}
public Destination getJMSReplyTo() throws JMSException {
@@ -120,7 +145,7 @@ public class StubTextMessage implements TextMessage {
}
public long getJMSTimestamp() throws JMSException {
return 0;
return this.timestamp;
}
public String getJMSType() throws JMSException {
@@ -128,7 +153,8 @@ public class StubTextMessage implements TextMessage {
}
public long getLongProperty(String name) throws JMSException {
return 0;
Object value = this.properties.get(name);
return (value instanceof Long) ? ((Long) value).longValue() : 0;
}
public Object getObjectProperty(String name) throws JMSException {
@@ -140,11 +166,13 @@ public class StubTextMessage implements TextMessage {
}
public short getShortProperty(String name) throws JMSException {
return 0;
Object value = this.properties.get(name);
return (value instanceof Short) ? ((Short) value).shortValue() : 0;
}
public String getStringProperty(String name) throws JMSException {
return null;
Object value = this.properties.get(name);
return (value instanceof String) ? (String) value : null;
}
public boolean propertyExists(String name) throws JMSException {
@@ -176,15 +204,19 @@ public class StubTextMessage implements TextMessage {
}
public void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException {
this.correlationId = new String(correlationID);
}
public void setJMSDeliveryMode(int deliveryMode) throws JMSException {
this.deliveryMode = deliveryMode;
}
public void setJMSDestination(Destination destination) throws JMSException {
this.destination = destination;
}
public void setJMSExpiration(long expiration) throws JMSException {
this.expiration = expiration;
}
public void setJMSMessageID(String id) throws JMSException {
@@ -192,9 +224,11 @@ public class StubTextMessage implements TextMessage {
}
public void setJMSPriority(int priority) throws JMSException {
this.priority = priority;
}
public void setJMSRedelivered(boolean redelivered) throws JMSException {
this.redelivered = redelivered;
}
public void setJMSReplyTo(Destination replyTo) throws JMSException {
@@ -202,6 +236,7 @@ public class StubTextMessage implements TextMessage {
}
public void setJMSTimestamp(long timestamp) throws JMSException {
this.timestamp = timestamp;
}
public void setJMSType(String type) throws JMSException {