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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user