Added MessageHeaders and MessageBuilder. Messages are now immutable (including header maps).

This commit is contained in:
Mark Fisher
2008-07-17 22:58:56 +00:00
parent b9ea75ea98
commit 2c95306f63
91 changed files with 1154 additions and 1083 deletions

View File

@@ -60,13 +60,13 @@ public abstract class AbstractRemotingHandler implements MessageHandler {
this.getClass().getName() + " expects a Serializable payload type " +
"but encountered '" + message.getPayload().getClass().getName() + "'");
}
for (String attributeName : message.getHeader().getAttributeNames()) {
Object attribute = message.getHeader().getAttribute(attributeName);
for (String headerName : message.getHeaders().keySet()) {
Object attribute = message.getHeaders().get(headerName);
if (!(attribute instanceof Serializable)) {
throw new MessageHandlingException(message,
this.getClass().getName() + " expects Serializable attribute types " +
"but encountered '" + attribute.getClass().getName() + "' for the attribute '" +
attributeName + "'");
headerName + "'");
}
}
}

View File

@@ -16,7 +16,9 @@
package org.springframework.integration.adapter;
import org.springframework.integration.message.MessageHeader;
import java.util.Map;
import org.springframework.integration.message.MessageHeaders;
/**
* Strategy interface for mapping between a source or target object and an
@@ -26,8 +28,8 @@ import org.springframework.integration.message.MessageHeader;
*/
public interface MessageHeaderMapper<T> {
void mapFromMessageHeader(MessageHeader header, T target);
void mapFromMessageHeaders(MessageHeaders headers, T target);
void mapToMessageHeader(T source, MessageHeader header);
Map<String, Object> mapToMessageHeaders(T source);
}

View File

@@ -25,6 +25,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageCreator;
import org.springframework.integration.message.MessageDeliveryAware;
import org.springframework.integration.message.MessagingException;
@@ -64,6 +65,7 @@ public abstract class AbstractDirectorySource implements MessageSource<Object>,
return messageCreator;
}
@SuppressWarnings("unchecked")
public final Message receive() {
try {
this.establishConnection();
@@ -73,9 +75,10 @@ public abstract class AbstractDirectorySource implements MessageSource<Object>,
if (!getDirectoryContentManager().getBacklog().isEmpty()) {
File file = retrieveNextFile();
Message message = this.messageCreator.createMessage(file);
message.getHeader().setProperty(FileNameGenerator.FILENAME_PROPERTY_KEY, file.getName());
message.getHeader().setAttribute(FILE_INFO_PROPERTY,
getDirectoryContentManager().getBacklog().get(file.getName()));
message = MessageBuilder.fromMessage(message)
.setHeader(FileNameGenerator.FILENAME_PROPERTY_KEY, file.getName())
.setHeader(FILE_INFO_PROPERTY, getDirectoryContentManager().getBacklog().get(file.getName()))
.build();
return message;
}
return null;
@@ -89,7 +92,7 @@ public abstract class AbstractDirectorySource implements MessageSource<Object>,
}
public void onSend(Message<?> message) {
String filename = message.getHeader().getProperty(FileNameGenerator.FILENAME_PROPERTY_KEY);
String filename = message.getHeaders().get(FileNameGenerator.FILENAME_PROPERTY_KEY, String.class);
if (StringUtils.hasText(filename)) {
this.directoryContentManager.fileProcessed(filename);
}

View File

@@ -28,9 +28,9 @@ import org.springframework.util.StringUtils;
public class DefaultFileNameGenerator implements FileNameGenerator {
public String generateFileName(Message<?> message) {
String filenameProperty = message.getHeader().getProperty(FILENAME_PROPERTY_KEY);
String filenameProperty = message.getHeaders().get(FILENAME_PROPERTY_KEY, String.class);
return StringUtils.hasText(filenameProperty) ?
filenameProperty : message.getId() + "-" + System.currentTimeMillis() + ".msg";
filenameProperty : message.getId() + ".msg";
}
}

View File

@@ -18,7 +18,9 @@ package org.springframework.integration.adapter.jms;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jms.Destination;
@@ -27,7 +29,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.util.StringUtils;
/**
@@ -44,27 +46,27 @@ public class DefaultJmsHeaderMapper implements MessageHeaderMapper<javax.jms.Mes
private final Log logger = LogFactory.getLog(this.getClass());
public void mapFromMessageHeader(MessageHeader header, javax.jms.Message jmsMessage) {
public void mapFromMessageHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) {
try {
Object jmsCorrelationId = header.getAttribute(JmsAttributeKeys.CORRELATION_ID);
Object jmsCorrelationId = headers.get(JmsAttributeKeys.CORRELATION_ID);
if (jmsCorrelationId != null && (jmsCorrelationId instanceof String)) {
jmsMessage.setJMSCorrelationID((String) jmsCorrelationId);
}
Object jmsReplyTo = header.getAttribute(JmsAttributeKeys.REPLY_TO);
Object jmsReplyTo = headers.get(JmsAttributeKeys.REPLY_TO);
if (jmsReplyTo != null && (jmsReplyTo instanceof Destination)) {
jmsMessage.setJMSReplyTo((Destination) jmsReplyTo);
}
Object jmsType = header.getAttribute(JmsAttributeKeys.TYPE);
Object jmsType = headers.get(JmsAttributeKeys.TYPE);
if (jmsType != null && (jmsType instanceof String)) {
jmsMessage.setJMSType((String) jmsType);
}
String prefix = JmsAttributeKeys.USER_DEFINED_ATTRIBUTE_PREFIX;
Set<String> attributeNames = header.getAttributeNames();
Set<String> attributeNames = headers.keySet();
for (String attributeName : attributeNames) {
if (attributeName.startsWith(prefix)) {
String jmsAttributeName = attributeName.substring(prefix.length());
if (StringUtils.hasText(attributeName)) {
Object value = header.getAttribute(attributeName);
Object value = headers.get(attributeName);
if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) {
try {
jmsMessage.setObjectProperty(jmsAttributeName, value);
@@ -86,26 +88,27 @@ public class DefaultJmsHeaderMapper implements MessageHeaderMapper<javax.jms.Mes
}
}
public void mapToMessageHeader(javax.jms.Message jmsMessage, MessageHeader header) {
public Map<String, Object> mapToMessageHeaders(javax.jms.Message jmsMessage) {
Map<String, Object> headers = new HashMap<String, Object>();
try {
String correlationId = jmsMessage.getJMSCorrelationID();
if (correlationId != null) {
header.setAttribute(JmsAttributeKeys.CORRELATION_ID, correlationId);
headers.put(JmsAttributeKeys.CORRELATION_ID, correlationId);
}
Destination replyTo = jmsMessage.getJMSReplyTo();
if (replyTo != null) {
header.setAttribute(JmsAttributeKeys.REPLY_TO, replyTo);
headers.put(JmsAttributeKeys.REPLY_TO, replyTo);
}
header.setAttribute(JmsAttributeKeys.REDELIVERED, jmsMessage.getJMSRedelivered());
headers.put(JmsAttributeKeys.REDELIVERED, jmsMessage.getJMSRedelivered());
String type = jmsMessage.getJMSType();
if (type != null) {
header.setAttribute(JmsAttributeKeys.TYPE, type);
headers.put(JmsAttributeKeys.TYPE, type);
}
Enumeration<?> jmsPropertyNames = jmsMessage.getPropertyNames();
if (jmsPropertyNames != null) {
while (jmsPropertyNames.hasMoreElements()) {
String propertyName = jmsPropertyNames.nextElement().toString();
header.setAttribute(JmsAttributeKeys.USER_DEFINED_ATTRIBUTE_PREFIX + propertyName,
headers.put(JmsAttributeKeys.USER_DEFINED_ATTRIBUTE_PREFIX + propertyName,
jmsMessage.getObjectProperty(propertyName));
}
}
@@ -115,6 +118,7 @@ public class DefaultJmsHeaderMapper implements MessageHeaderMapper<javax.jms.Mes
logger.warn("error occurred while mapping properties to MessageHeader", t);
}
}
return headers;
}
}

View File

@@ -16,12 +16,15 @@
package org.springframework.integration.adapter.jms;
import java.util.Map;
import javax.jms.JMSException;
import javax.jms.Session;
import org.springframework.integration.adapter.MessageHeaderMapper;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.integration.message.MessagingException;
import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;
@@ -52,8 +55,8 @@ public class HeaderMappingMessageConverter implements MessageConverter {
public Object fromMessage(javax.jms.Message jmsMessage) throws JMSException, MessageConversionException {
Object payload = this.converter.fromMessage(jmsMessage);
Message<?> message = new GenericMessage<Object>(payload);
this.headerMapper.mapToMessageHeader(jmsMessage, message.getHeader());
Map<String, Object> headerMap = this.headerMapper.mapToMessageHeaders(jmsMessage);
Message<?> message = MessageBuilder.fromPayload(payload).copyHeaders(new MessageHeaders(headerMap)).build();
return message;
}
@@ -64,7 +67,7 @@ public class HeaderMappingMessageConverter implements MessageConverter {
}
Message<?> message = (Message<?>) object;
javax.jms.Message jmsMessage = this.converter.toMessage(message.getPayload(), session);
this.headerMapper.mapFromMessageHeader(message.getHeader(), jmsMessage);
this.headerMapper.mapFromMessageHeaders(message.getHeaders(), jmsMessage);
return jmsMessage;
}

View File

@@ -59,12 +59,12 @@ public class DefaultMailHeaderGenerator extends AbstractMailHeaderGenerator {
private String retrieveAsString(Message<?> message, String key) {
Object value = message.getHeader().getAttribute(key);
Object value = message.getHeaders().get(key);
return (value instanceof String) ? (String) value : null;
}
private String[] retrieveAsStringArray(Message<?> message, String key) {
Object value = message.getHeader().getAttribute(key);
Object value = message.getHeaders().get(key);
if (value instanceof String[]) {
return (String[]) value;
}