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

@@ -22,7 +22,6 @@ import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.message.MessagePriority;
/**
@@ -90,8 +89,10 @@ public class PriorityChannel extends QueueChannel {
private static class MessagePriorityComparator implements Comparator<Message<?>> {
public int compare(Message<?> message1, Message<?> message2) {
MessagePriority priority1 = message1.getHeader().getPriority();
MessagePriority priority2 = message2.getHeader().getPriority();
MessagePriority priority1 = message1.getHeaders().getPriority();
MessagePriority priority2 = message2.getHeaders().getPriority();
priority1 = priority1 != null ? priority1 : MessagePriority.NORMAL;
priority2 = priority2 != null ? priority2 : MessagePriority.NORMAL;
return priority1.compareTo(priority2);
}
}

View File

@@ -25,8 +25,8 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.context.Lifecycle;
import org.springframework.integration.channel.ChannelInterceptor;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.selector.MessageSelector;
import org.springframework.util.Assert;
@@ -100,8 +100,9 @@ public class WireTap extends ChannelInterceptorAdapter implements Lifecycle {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
if (this.running && this.selectorsAccept(message)) {
Message<?> duplicate = new GenericMessage<Object>(message.getPayload(), message.getHeader());
duplicate.getHeader().setAttribute(ORIGINAL_MESSAGE_ID_KEY, message.getId());
Message<?> duplicate = MessageBuilder.fromMessage(message)
.setHeader(ORIGINAL_MESSAGE_ID_KEY, message.getId())
.build();
if (!this.secondaryChannel.send(duplicate, 0)) {
if (logger.isWarnEnabled()) {
logger.warn("Failed to send message to secondary channel '" + this.secondaryChannel.getName()

View File

@@ -22,9 +22,10 @@ import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.handler.ReplyHandler;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageDeliveryException;
import org.springframework.integration.message.MessageHandlingException;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -82,9 +83,9 @@ public class HandlerEndpoint extends AbstractEndpoint {
super.initialize();
}
private MessageChannel resolveReplyChannel(MessageHeader originalMessageHeader) {
private MessageChannel resolveReplyChannel(Message<?> originalMessage) {
if (this.returnAddressOverrides) {
MessageChannel channel = this.getReturnAddress(originalMessageHeader);
MessageChannel channel = this.getReturnAddress(originalMessage);
if (channel == null) {
channel = this.getOutputChannel();
}
@@ -93,14 +94,14 @@ public class HandlerEndpoint extends AbstractEndpoint {
else {
MessageChannel channel = this.getOutputChannel();
if (channel == null) {
channel = this.getReturnAddress(originalMessageHeader);
channel = this.getReturnAddress(originalMessage);
}
return channel;
}
}
private MessageChannel getReturnAddress(MessageHeader originalMessageHeader) {
Object returnAddress = originalMessageHeader.getReturnAddress();
private MessageChannel getReturnAddress(Message<?> originalMessage) {
Object returnAddress = originalMessage.getHeaders().getReturnAddress();
if (returnAddress != null) {
if (returnAddress instanceof MessageChannel) {
return (MessageChannel) returnAddress;
@@ -120,10 +121,12 @@ public class HandlerEndpoint extends AbstractEndpoint {
protected Message<?> handleMessage(Message<?> message) {
Message<?> replyMessage = this.handler.handle(message);
if (replyMessage != null) {
if (replyMessage.getHeader().getCorrelationId() == null) {
replyMessage.getHeader().setCorrelationId(message.getId());
Object correlationId = replyMessage.getHeaders().getCorrelationId();
if (correlationId == null) {
replyMessage = MessageBuilder.fromMessage(replyMessage)
.setHeader(MessageHeaders.CORRELATION_ID, message.getId()).build();
}
this.replyHandler.handle(replyMessage, message.getHeader());
this.replyHandler.handle(replyMessage, message);
}
return null;
}
@@ -131,14 +134,17 @@ public class HandlerEndpoint extends AbstractEndpoint {
private class EndpointReplyHandler implements ReplyHandler {
public void handle(Message<?> replyMessage, MessageHeader originalMessageHeader) {
public void handle(Message<?> replyMessage, Message<?> originalMessage) {
if (replyMessage == null) {
return;
}
MessageChannel replyChannel = resolveReplyChannel(originalMessageHeader);
MessageChannel replyChannel = resolveReplyChannel(replyMessage);
if (replyChannel == null) {
throw new MessageHandlingException(replyMessage, "Unable to determine reply channel for message. " +
"Provide an 'outputChannelName' on the message endpoint or a 'returnAddress' in the message header");
replyChannel = resolveReplyChannel(originalMessage);
if (replyChannel == null) {
throw new MessageHandlingException(replyMessage, "Unable to determine reply channel for message. " +
"Provide an 'outputChannelName' on the message endpoint or a 'returnAddress' in the message header");
}
}
if (logger.isDebugEnabled()) {
logger.debug("endpoint '" + HandlerEndpoint.this + "' replying to channel '" + replyChannel + "' with message: " + replyMessage);

View File

@@ -28,7 +28,9 @@ import org.springframework.integration.endpoint.HandlerEndpoint;
import org.springframework.integration.handler.ReplyHandler;
import org.springframework.integration.handler.ReplyMessageCorrelator;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageDeliveryException;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.message.selector.MessageSelector;
@@ -157,8 +159,9 @@ public class RequestReplyTemplate implements MessageBusAware {
*/
public boolean request(Message<?> message, ReplyHandler replyHandler) {
MessageChannel replyChannelAdapter = new ReplyHandlingChannelAdapter(message, replyHandler);
message.getHeader().setReturnAddress(replyChannelAdapter);
return this.send(message);
Message<?> requestMessage = MessageBuilder.fromMessage(message)
.setReturnAddress(replyChannelAdapter).build();
return this.send(requestMessage);
}
/**
@@ -186,7 +189,8 @@ public class RequestReplyTemplate implements MessageBusAware {
if (this.replyMessageCorrelator == null) {
this.registerReplyMessageCorrelator();
}
message.getHeader().setReturnAddress(this.replyChannel);
message = MessageBuilder.fromMessage(message)
.setReturnAddress(this.replyChannel).build();
this.send(message);
return (this.replyTimeout >= 0) ? this.replyMessageCorrelator.getReply(message.getId(), this.replyTimeout) :
this.replyMessageCorrelator.getReply(message.getId());
@@ -194,8 +198,9 @@ public class RequestReplyTemplate implements MessageBusAware {
private Message<?> sendAndReceiveWithTemporaryChannel(Message<?> message) {
RendezvousChannel temporaryChannel = new RendezvousChannel();
message.getHeader().setReturnAddress(temporaryChannel);
this.send(message);
Message<?> requestMessage = MessageBuilder.fromMessage(message)
.setReturnAddress(temporaryChannel).build();
this.send(requestMessage);
return this.receiveResponse(temporaryChannel);
}
@@ -258,7 +263,7 @@ public class RequestReplyTemplate implements MessageBusAware {
}
public boolean send(Message<?> message) {
this.replyHandler.handle(message, originalMessage.getHeader());
this.replyHandler.handle(message, originalMessage);
return true;
}

View File

@@ -24,8 +24,10 @@ import org.springframework.integration.channel.ChannelRegistryAware;
import org.springframework.integration.message.DefaultMessageCreator;
import org.springframework.integration.message.DefaultMessageMapper;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageCreator;
import org.springframework.integration.message.MessageHandlingException;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.integration.message.MessageMapper;
import org.springframework.integration.util.AbstractMethodInvokingAdapter;
import org.springframework.util.Assert;
@@ -124,16 +126,11 @@ public abstract class AbstractMessageHandlerAdapter extends AbstractMethodInvoki
protected Message<?> createReplyMessage(Object returnValue, Message<?> originalMessage) {
Message<?> reply = this.messageCreator.createMessage(returnValue);
if (reply != null) {
reply.copyHeader(originalMessage.getHeader(), false);
Object correlationId = reply.getHeader().getCorrelationId();
if (correlationId == null) {
Object orginalCorrelationId = originalMessage.getHeader().getCorrelationId();
reply.getHeader().setCorrelationId((orginalCorrelationId != null) ?
orginalCorrelationId : originalMessage.getId());
}
if (reply == null) {
return null;
}
return reply;
return MessageBuilder.fromMessage(reply).copyHeadersIfAbsent(originalMessage.getHeaders())
.setHeaderIfAbsent(MessageHeaders.CORRELATION_ID, originalMessage.getId()).build();
}
/**

View File

@@ -17,7 +17,6 @@
package org.springframework.integration.handler;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageHeader;
/**
* Strategy interface for handling reply messages.
@@ -26,6 +25,6 @@ import org.springframework.integration.message.MessageHeader;
*/
public interface ReplyHandler {
void handle(Message<?> replyMessage, MessageHeader originalMessageHeader);
void handle(Message<?> replyMessage, Message<?> originalMessage);
}

View File

@@ -70,7 +70,7 @@ public class ReplyMessageCorrelator implements MessageHandler {
* returns the 'correlationId' from the message header.
*/
protected Object getCorrelationId(final Message<?> message) {
return message.getHeader().getCorrelationId();
return message.getHeaders().getCorrelationId();
}
}

View File

@@ -17,10 +17,8 @@
package org.springframework.integration.handler.annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
@@ -29,7 +27,7 @@ import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.integration.ConfigurationException;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageHandlingException;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.integration.message.MessageMapper;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -124,7 +122,7 @@ public class AnnotationMethodMessageMapper implements MessageMapper {
MethodParameterMetadata metadata = this.parameterMetadata[i];
Class<?> expectedType = metadata.type;
if (expectedType.equals(HeaderAttribute.class)) {
Object value = message.getHeader().getAttribute(metadata.key);
Object value = message.getHeaders().get(metadata.key);
if (value == null && metadata.required) {
throw new MessageHandlingException(message,
"required attribute '" + metadata.key + "' not available");
@@ -132,7 +130,7 @@ public class AnnotationMethodMessageMapper implements MessageMapper {
args[i] = value;
}
else if (expectedType.equals(HeaderProperty.class)) {
Object value = message.getHeader().getProperty(metadata.key);
Object value = message.getHeaders().get(metadata.key);
if (value == null && metadata.required) {
throw new MessageHandlingException(message,
"required property '" + metadata.key + "' not available");
@@ -146,10 +144,10 @@ public class AnnotationMethodMessageMapper implements MessageMapper {
args[i] = message.getPayload();
}
else if (expectedType.equals(Map.class)) {
args[i] = this.getHeaderAttributes(message);
args[i] = message.getHeaders();
}
else if (expectedType.equals(Properties.class)) {
args[i] = this.getHeaderProperties(message);
args[i] = this.getStringTypedHeaders(message);
}
else {
args[i] = message.getPayload();
@@ -158,22 +156,14 @@ public class AnnotationMethodMessageMapper implements MessageMapper {
return args;
}
private Map<String, Object> getHeaderAttributes(Message<?> message) {
Map<String, Object> attributes = new HashMap<String, Object>();
MessageHeader header = message.getHeader();
Set<String> attributeNames = header.getAttributeNames();
for (String name : attributeNames) {
attributes.put(name, header.getAttribute(name));
}
return attributes;
}
private Properties getHeaderProperties(Message<?> message) {
private Properties getStringTypedHeaders(Message<?> message) {
Properties properties = new Properties();
MessageHeader header = message.getHeader();
Set<String> propertyNames = header.getPropertyNames();
for (String name : propertyNames) {
properties.setProperty(name, header.getProperty(name));
MessageHeaders headers = message.getHeaders();
for (String key : headers.keySet()) {
Object value = headers.get(key);
if (value instanceof String) {
properties.setProperty(key, (String) value);
}
}
return properties;
}

View File

@@ -1,162 +0,0 @@
/*
* 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.message;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* The default implementation of the {@link MessageHeader} interface.
*
* @author Mark Fisher
*/
public class DefaultMessageHeader implements MessageHeader, Serializable {
private final long timestamp = System.currentTimeMillis();
private volatile Date expiration;
private volatile Object correlationId;
private transient volatile Object returnAddress;
private volatile int sequenceNumber = 1;
private volatile int sequenceSize = 1;
private volatile MessagePriority priority = MessagePriority.NORMAL;
private final Properties properties = new Properties();
private final ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<String, Object>();
/**
* Return the creation time of this message (in milliseconds).
*/
public long getTimestamp() {
return this.timestamp;
}
/**
* Return the expiration date for this message or <code>null</code> to
* indicate 'never expire'.
*/
public Date getExpiration() {
return this.expiration;
}
/**
* Set the expiration date for this message or <code>null</code> to
* indicate 'never expire'. The default is <code>null</code>.
*/
public void setExpiration(Date expiration) {
this.expiration = expiration;
}
public Object getCorrelationId() {
return this.correlationId;
}
public void setCorrelationId(Object correlationId) {
this.correlationId = correlationId;
}
public Object getReturnAddress() {
return this.returnAddress;
}
public void setReturnAddress(Object returnAddress) {
this.returnAddress = returnAddress;
}
public int getSequenceNumber() {
return this.sequenceNumber;
}
public void setSequenceNumber(int sequenceNumber) {
this.sequenceNumber = sequenceNumber;
}
public int getSequenceSize() {
return this.sequenceSize;
}
public void setSequenceSize(int sequenceSize) {
this.sequenceSize = sequenceSize;
}
public MessagePriority getPriority() {
return this.priority;
}
public void setPriority(MessagePriority priority) {
this.priority = priority;
}
public String getProperty(String key) {
return this.properties.getProperty(key);
}
public String setProperty(String key, String value) {
return (String) this.properties.setProperty(key, value);
}
public String removeProperty(String key) {
return (String) this.properties.remove(key);
}
public Set<String> getPropertyNames() {
Set<String> propertyNames = new HashSet<String>();
for (Object key : this.properties.keySet()) {
propertyNames.add((String) key);
}
return propertyNames;
}
public Object getAttribute(String key) {
return this.attributes.get(key);
}
public Object setAttribute(String key, Object value) {
return this.attributes.put(key, value);
}
public Object setAttributeIfAbsent(String key, Object value) {
return this.attributes.putIfAbsent(key, value);
}
public Object removeAttribute(String key) {
return this.attributes.remove(key);
}
public Set<String> getAttributeNames() {
return this.attributes.keySet();
}
public String toString() {
return "[CorrelationID=" + this.correlationId + "][Properties=" + this.properties + "][Attributes=" + this.attributes +
"][Timestamp=" + this.timestamp + "][Expiration=" + this.expiration + "][Priority=" + this.priority +
"][Sequence #" + this.sequenceNumber + " (of " + this.sequenceSize + ")]";
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* 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.
@@ -27,8 +27,4 @@ public class ErrorMessage extends GenericMessage<Throwable> {
super(payload);
}
public ErrorMessage(Object id, Throwable payload) {
super(id, payload);
}
}

View File

@@ -16,42 +16,30 @@
package org.springframework.integration.message;
import java.util.Date;
import java.util.Set;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.springframework.integration.util.IdGenerator;
import org.springframework.integration.util.RandomUuidGenerator;
import org.springframework.util.Assert;
/**
* Base Message class defining common properties such as id, header, and lock.
* Base Message class defining common properties such as id, payload, and headers.
*
* @author Mark Fisher
*/
public class GenericMessage<T> implements Message<T> {
public class GenericMessage<T> implements Message<T>, Serializable {
private final Object id;
private final MessageHeader header = new DefaultMessageHeader();
private final static String ID_HEADER_KEY = "id";
private volatile T payload;
private final MessageHeaders headers;
private transient final IdGenerator defaultIdGenerator = new RandomUuidGenerator();
/**
* Create a new message with the given id and payload.
*
* @param id unique identifier for this message
* @param payload the message payload
*/
public GenericMessage(Object id, T payload) {
Assert.notNull(id, "id must not be null");
Assert.notNull(payload, "payload must not be null");
this.id = id;
this.payload = payload;
}
/**
* Create a new message with the given payload. The id will be generated by
* the default {@link IdGenerator} strategy.
@@ -59,85 +47,45 @@ public class GenericMessage<T> implements Message<T> {
* @param payload the message payload
*/
public GenericMessage(T payload) {
Assert.notNull(payload, "payload must not be null");
this.id = this.defaultIdGenerator.generateId();
this.payload = payload;
this(payload, null);
}
/**
* Create a new message with the given payload. The id will be generated by
* the default {@link IdGenerator} strategy. The header will be populated
* with the attributes and properties of the provided header.
* the default {@link IdGenerator} strategy. The headers will be populated
* with the provided header values.
*
* @param payload the message payload
* @param headerToCopy message header whose attributes and properties should
* be copied into the new message's header
* @param headers message headers
*/
public GenericMessage(T payload, MessageHeader headerToCopy) {
this(payload);
this.copyHeader(headerToCopy, true);
public GenericMessage(T payload, Map<String, Object> headers) {
Assert.notNull(payload, "payload must not be null");
this.payload = payload;
if (headers == null) {
headers = new HashMap<String, Object>();
}
else if (headers instanceof MessageHeaders) {
headers = new HashMap<String, Object>(headers);
}
headers.put(ID_HEADER_KEY, this.defaultIdGenerator.generateId());
this.headers = new MessageHeaders(headers);
}
public Object getId() {
return this.id;
return this.headers.get(ID_HEADER_KEY);
}
public MessageHeader getHeader() {
return this.header;
public MessageHeaders getHeaders() {
return this.headers;
}
public T getPayload() {
return this.payload;
}
public void setPayload(T payload) {
Assert.notNull(payload, "payload must not be null");
this.payload = payload;
}
public boolean isExpired() {
Date expiration = this.header.getExpiration();
return (expiration != null) ? expiration.getTime() < System.currentTimeMillis() : false;
}
public String toString() {
return "[ID=" + this.id + "][Header=" + this.header + "][Payload='" + this.payload + "']";
}
public void copyHeader(final MessageHeader headerToCopy, boolean overrideExistingValues) {
Set<String> propertyNames = headerToCopy.getPropertyNames();
for (String key : propertyNames) {
if (overrideExistingValues) {
this.header.setProperty(key, headerToCopy.getProperty(key));
}
else if (this.header.getProperty(key) == null) {
this.header.setProperty(key, headerToCopy.getProperty(key));
}
}
Set<String> attributeNames = headerToCopy.getAttributeNames();
for (String key : attributeNames) {
if (overrideExistingValues) {
this.header.setAttribute(key, headerToCopy.getAttribute(key));
}
else {
this.header.setAttributeIfAbsent(key, headerToCopy.getAttribute(key));
}
}
if (overrideExistingValues) {
this.header.setSequenceNumber(headerToCopy.getSequenceNumber());
this.header.setSequenceSize(headerToCopy.getSequenceSize());
this.header.setReturnAddress(headerToCopy.getReturnAddress());
}
else {
if (headerToCopy.getSequenceSize() > 1 && this.header.getSequenceSize() == 1) {
this.header.setSequenceSize(headerToCopy.getSequenceSize());
this.header.setSequenceNumber(headerToCopy.getSequenceNumber());
}
if (headerToCopy.getReturnAddress() != null && this.header.getReturnAddress() == null) {
this.header.setReturnAddress(headerToCopy.getReturnAddress());
}
}
return "[ID=" + this.getId() + "][Headers=" + this.headers + "][Payload='" + this.payload + "']";
}
}

View File

@@ -16,23 +16,18 @@
package org.springframework.integration.message;
import java.io.Serializable;
/**
* The central interface that any Message type must implement.
*
* @author Mark Fisher
* @author Arjen Poutsma
*/
public interface Message<T> extends Serializable {
public interface Message<T> {
Object getId();
MessageHeader getHeader();
T getPayload();
boolean isExpired();
void copyHeader(MessageHeader header, boolean overwriteExistingValues);
MessageHeaders getHeaders();
}

View File

@@ -0,0 +1,144 @@
/*
* 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.message;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.springframework.util.Assert;
/**
* @author Arjen Poutsma
* @author Mark Fisher
*/
public final class MessageBuilder<T> {
private final T payload;
private final Map<String, Object> headers = new HashMap<String, Object>();
/**
* Create a new {@link Message} instance with no header values using
* the provided payload instance.
*/
private MessageBuilder(T payload) {
Assert.notNull(payload, "payload must not be null");
this.payload = payload;
}
/**
* Create a builder for a new {@link Message} instance pre-populated with
* all of the headers copied from the provided message. The payload will
* also be taken from the provided message.
*
* @param messageToCopy the Message from which all headers should be copied
*/
public static <T> MessageBuilder<T> fromMessage(Message<T> message) {
MessageBuilder<T> builder = new MessageBuilder<T>(message.getPayload());
builder.headers.putAll(message.getHeaders());
return builder;
}
/**
* Create a builder for a new {@link Message} instance with no header
* values using the provided payload instance.
*
* @param payload the payload for the new message
*/
public static <T> MessageBuilder<T> fromPayload(T payload) {
MessageBuilder<T> builder = new MessageBuilder<T>(payload);
return builder;
}
public MessageBuilder<T> setHeader(String headerName, Object headerValue) {
this.headers.put(headerName, headerValue);
return this;
}
public MessageBuilder<T> setHeaderIfAbsent(String headerName, Object headerValue) {
if (this.headers.get(headerName) == null) {
this.headers.put(headerName, headerValue);
}
return this;
}
public MessageBuilder<T> copyHeadersFromMessage(Message<?> message) {
return this.copyHeaders(message.getHeaders());
}
public MessageBuilder<T> copyHeaders(MessageHeaders headersToCopy) {
Set<String> keys = headersToCopy.keySet();
for (String key : keys) {
if (key.equals(MessageHeaders.TIMESTAMP)) {
continue;
}
this.setHeader(key, headersToCopy.get(key));
}
return this;
}
public MessageBuilder<T> copyHeadersFromMessageIfAbsent(Message<?> message) {
return this.copyHeadersIfAbsent(message.getHeaders());
}
public MessageBuilder<T> copyHeadersIfAbsent(MessageHeaders headersToCopy) {
Set<String> keys = headersToCopy.keySet();
for (String key : keys) {
if (key.equals(MessageHeaders.TIMESTAMP)) {
continue;
}
if (this.headers.get(key) == null) {
this.setHeaderIfAbsent(key, headersToCopy.get(key));
}
}
return this;
}
public MessageBuilder<T> setExpirationDate(Date expirationDate) {
return this.setHeader(MessageHeaders.EXPIRATION_DATE, expirationDate);
}
public MessageBuilder<T> setCorrelationId(Object correlationId) {
return this.setHeader(MessageHeaders.CORRELATION_ID, correlationId);
}
public MessageBuilder<T> setReturnAddress(Object returnAddress) {
return this.setHeader(MessageHeaders.RETURN_ADDRESS, returnAddress);
}
public MessageBuilder<T> setSequenceNumber(Integer sequenceNumber) {
return this.setHeader(MessageHeaders.SEQUENCE_NUMBER, sequenceNumber);
}
public MessageBuilder<T> setSequenceSize(Integer sequenceSize) {
return this.setHeader(MessageHeaders.SEQUENCE_SIZE, sequenceSize);
}
public MessageBuilder<T> setPriority(MessagePriority priority) {
return this.setHeader(MessageHeaders.PRIORITY, priority);
}
public Message<T> build() {
return new GenericMessage<T>(this.payload, this.headers);
}
}

View File

@@ -1,77 +0,0 @@
/*
* 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.message;
import java.util.Date;
import java.util.Set;
/**
* A holder for Message metadata. This includes information that may be used by
* the messaging system (such as <i>correlationId</i>) as well as information
* that is relevant for specific messaging endpoints. For the latter, String
* values may be stored as <i>properties</i> and Object values may be stored as
* <i>attributes</i>.
*
* @author Mark Fisher
*/
public interface MessageHeader {
long getTimestamp();
Date getExpiration();
void setExpiration(Date expiration);
Object getCorrelationId();
void setCorrelationId(Object correlationId);
Object getReturnAddress();
void setReturnAddress(Object returnAddress);
int getSequenceNumber();
void setSequenceNumber(int sequenceNumber);
int getSequenceSize();
void setSequenceSize(int sequenceSize);
MessagePriority getPriority();
void setPriority(MessagePriority priority);
String getProperty(String key);
String setProperty(String key, String value);
String removeProperty(String key);
Set<String> getPropertyNames();
Object getAttribute(String key);
Object setAttribute(String key, Object value);
Object setAttributeIfAbsent(String key, Object value);
Object removeAttribute(String key);
Set<String> getAttributeNames();
}

View File

@@ -0,0 +1,169 @@
/*
* 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.message;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* The headers for a {@link Message}.
*
* @author Arjen Poutsma
* @author Mark Fisher
*/
public final class MessageHeaders implements Map<String, Object>, Serializable {
public static final String TIMESTAMP = "internal.header.timestamp";
public static final String CORRELATION_ID = "internal.header.correlationId";
public static final String RETURN_ADDRESS = "internal.header.returnAddress";
public static final String EXPIRATION_DATE = "internal.header.exprirationDate";
public static final String PRIORITY = "internal.header.priority";
public static final String SEQUENCE_NUMBER = "internal.header.sequenceNumber";
public static final String SEQUENCE_SIZE = "internal.header.sequenceSize";
private final Map<String, Object> headers;
public MessageHeaders(Map<String, Object> headers) {
this.headers = (headers != null ? headers : new HashMap<String, Object>());
this.headers.put(TIMESTAMP, new Long(System.currentTimeMillis()));
}
public Long getTimestamp() {
return this.get(TIMESTAMP, Long.class);
}
public Date getExpirationDate() {
return this.get(EXPIRATION_DATE, Date.class);
}
public Object getCorrelationId() {
return this.get(CORRELATION_ID);
}
public Object getReturnAddress() {
return this.get(RETURN_ADDRESS);
}
public Integer getSequenceNumber() {
Integer sequenceNumber = this.get(SEQUENCE_NUMBER, Integer.class);
return (sequenceNumber != null ? sequenceNumber : 0);
}
public Integer getSequenceSize() {
Integer sequenceSize = this.get(SEQUENCE_SIZE, Integer.class);
return (sequenceSize != null ? sequenceSize : 0);
}
public MessagePriority getPriority() {
return this.get(PRIORITY, MessagePriority.class);
}
public void clear() {
this.headers.clear();
}
public boolean containsKey(Object key) {
return this.headers.containsKey(key);
}
public boolean containsValue(Object value) {
return this.headers.containsValue(value);
}
public Set<Map.Entry<String, Object>> entrySet() {
return Collections.unmodifiableSet(this.headers.entrySet());
}
@SuppressWarnings("unchecked")
public <T> T get(Object key, Class<T> type) {
Object value = this.headers.get(key);
if (value == null) {
return null;
}
if (!type.isAssignableFrom(value.getClass())) {
throw new MessagingException("Type mismatch for header '" + key + "'. Expected ["
+ type + "] but actual type is [" + value.getClass() + "]");
}
return (T) value;
}
public Object get(Object key) {
return this.headers.get(key);
}
public boolean isEmpty() {
return this.headers.isEmpty();
}
public Set<String> keySet() {
return Collections.unmodifiableSet(this.headers.keySet());
}
public Object put(String key, Object value) {
throw new UnsupportedOperationException("MessageHeaders is immutable.");
}
public void putAll(Map<? extends String, ? extends Object> t) {
throw new UnsupportedOperationException("MessageHeaders is immutable.");
}
public Object remove(Object key) {
throw new UnsupportedOperationException("MessageHeaders is immutable.");
}
public int size() {
return this.headers.size();
}
public Collection<Object> values() {
return Collections.unmodifiableCollection(this.headers.values());
}
public int hashCode() {
return headers.hashCode();
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj instanceof MessageHeaders) {
MessageHeaders other = (MessageHeaders) obj;
return this.headers.equals(other.headers);
}
return false;
}
public String toString() {
return headers.toString();
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* 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.
@@ -27,8 +27,4 @@ public class StringMessage extends GenericMessage<String> {
super(payload);
}
public StringMessage(Object id, String payload) {
super(id, payload);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* 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.

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* 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.
@@ -16,6 +16,8 @@
package org.springframework.integration.message.selector;
import java.util.Date;
import org.springframework.integration.message.Message;
/**
@@ -27,7 +29,11 @@ import org.springframework.integration.message.Message;
public class UnexpiredMessageSelector implements MessageSelector {
public boolean accept(Message<?> message) {
return (!message.isExpired());
Date expirationDate = message.getHeaders().getExpirationDate();
if (expirationDate == null) {
return true;
}
return expirationDate.getTime() > System.currentTimeMillis();
}
}

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.router;
import java.util.List;
@@ -168,7 +169,7 @@ public abstract class AbstractMessageBarrierHandler implements MessageHandler, I
if (!this.initialized) {
this.afterPropertiesSet();
}
Object correlationId = message.getHeader().getCorrelationId();
Object correlationId = message.getHeaders().getCorrelationId();
if (correlationId == null) {
throw new MessageHandlingException(message,
this.getClass().getSimpleName() + " requires the 'correlationId' property");
@@ -226,7 +227,7 @@ public abstract class AbstractMessageBarrierHandler implements MessageHandler, I
}
protected MessageChannel resolveReplyChannelFromMessage(Message<?> message) {
Object returnAddress = message.getHeader().getReturnAddress();
Object returnAddress = message.getHeaders().getReturnAddress();
if (returnAddress != null) {
if (returnAddress instanceof MessageChannel) {
return (MessageChannel) returnAddress;

View File

@@ -20,6 +20,7 @@ import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
@@ -87,11 +88,11 @@ public class AggregatingMessageHandler extends AbstractMessageBarrierHandler {
return new Message<?>[0];
}
Message<?> result = aggregator.aggregate(messages);
if (result.getHeader().getCorrelationId() == null) {
result.getHeader().setCorrelationId(correlationId);
if (result.getHeaders().getCorrelationId() == null) {
result = MessageBuilder.fromMessage(result)
.setCorrelationId(correlationId).build();
}
return new Message<?>[] { result };
}
}

View File

@@ -21,7 +21,7 @@ import java.util.Comparator;
import org.springframework.integration.message.Message;
/**
* A {@link Comparator} implementation based on the '<code>sequenceNumber</code>'
* A {@link Comparator} implementation based on the 'sequence number'
* property of a {@link Message Message's} header.
*
* @author Mark Fisher
@@ -29,9 +29,15 @@ import org.springframework.integration.message.Message;
public class MessageSequenceComparator implements Comparator<Message<?>> {
public int compare(Message<?> message1, Message<?> message2) {
int s1 = message1.getHeader().getSequenceNumber();
int s2 = message2.getHeader().getSequenceNumber();
return (s1 < s2) ? -1 : (s1 == s2) ? 0 : 1;
Integer s1 = message1.getHeaders().getSequenceNumber();
Integer s2 = message2.getHeaders().getSequenceNumber();
if (s1 == null) {
s1 = 0;
}
if (s2 == null) {
s2 = 0;
}
return s1.compareTo(s2);
}
}

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.router;
import java.util.ArrayList;
@@ -26,6 +27,7 @@ import org.springframework.integration.message.Message;
/**
* MessageBarrier implementation for resequencing. It can either
* release partial sequences as messages arrive, or the full sequence.
*
* @author Marius Bogoevici
*/
public class ResequencingMessageBarrier extends AbstractMessageBarrier {
@@ -44,7 +46,7 @@ public class ResequencingMessageBarrier extends AbstractMessageBarrier {
public ResequencingMessageBarrier(boolean releasePartialSequences) {
this.resequencingComparator = new Comparator<Message<?>>() {
public int compare(Message<?> m1, Message<?> m2) {
return m1.getHeader().getSequenceNumber() - m2.getHeader().getSequenceNumber();
return m1.getHeaders().getSequenceNumber() - m2.getHeaders().getSequenceNumber();
}
};
this.releasePartialSequences = releasePartialSequences;
@@ -66,10 +68,10 @@ public class ResequencingMessageBarrier extends AbstractMessageBarrier {
//(aggregated, this means that the last possibile partial sequence of messages has been received
Message<?> firstMessage = this.messages.get(0);
Message<?> lastMessage = this.messages.get(messages.size() - 1);
return (lastMessage.getHeader().getSequenceNumber() == lastMessage.getHeader().getSequenceSize()
&& (lastMessage.getHeader().getSequenceNumber() - firstMessage.getHeader().getSequenceNumber()
return (lastMessage.getHeaders().getSequenceNumber() == lastMessage.getHeaders().getSequenceSize()
&& (lastMessage.getHeaders().getSequenceNumber() - firstMessage.getHeaders().getSequenceNumber()
== this.messages.size() - 1
&& this.lastReleasedSequenceNumber == firstMessage.getHeader().getSequenceNumber() - 1));
&& this.lastReleasedSequenceNumber == firstMessage.getHeaders().getSequenceNumber() - 1));
}
protected List<Message<?>> releaseAvailableMessages() {
@@ -78,9 +80,9 @@ public class ResequencingMessageBarrier extends AbstractMessageBarrier {
Iterator<Message<?>> it = this.messages.iterator();
while (it.hasNext()) {
Message<?> currentMessage = it.next();
if (this.lastReleasedSequenceNumber == currentMessage.getHeader().getSequenceNumber() - 1) {
if (this.lastReleasedSequenceNumber == currentMessage.getHeaders().getSequenceNumber() - 1) {
releasedMessages.add(currentMessage);
this.lastReleasedSequenceNumber = currentMessage.getHeader().getSequenceNumber();
this.lastReleasedSequenceNumber = currentMessage.getHeaders().getSequenceNumber();
it.remove();
}
else {

View File

@@ -62,8 +62,8 @@ public class ResequencingMessageHandler extends AbstractMessageBarrierHandler{
}
protected boolean isBarrierRemovable(Object correlationId, List<Message<?>> releasedMessages) {
return (releasedMessages.get(releasedMessages.size() - 1).getHeader().getSequenceNumber() ==
releasedMessages.get(releasedMessages.size() - 1).getHeader().getSequenceSize());
return (releasedMessages.get(releasedMessages.size() - 1).getHeaders().getSequenceNumber() ==
releasedMessages.get(releasedMessages.size() - 1).getHeaders().getSequenceSize());
}
}

View File

@@ -35,7 +35,7 @@ public class SequenceSizeCompletionStrategy implements CompletionStrategy {
if (CollectionUtils.isEmpty(messages)) {
return false;
}
return messages.size() != 0 && (messages.size() >= messages.get(0).getHeader().getSequenceSize());
return messages.size() != 0 && (messages.size() >= messages.get(0).getHeaders().getSequenceSize());
}
}

View File

@@ -26,6 +26,7 @@ import org.springframework.integration.channel.ChannelRegistryAware;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.handler.AbstractMessageHandlerAdapter;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
/**
* MessageHandler adapter for methods annotated with {@link Splitter @Splitter}.
@@ -83,7 +84,10 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdapter
for (Object item : items) {
Message<?> splitMessage = (item instanceof Message<?>) ?
(Message<?>) item : this.createReplyMessage(item, originalMessage);
this.prepareMessage(splitMessage, originalMessage.getId(), ++sequenceNumber, sequenceSize);
splitMessage = MessageBuilder.fromMessage(splitMessage)
.setCorrelationId(originalMessage.getId())
.setSequenceNumber(++sequenceNumber)
.setSequenceSize(sequenceSize).build();
this.sendMessage(splitMessage, this.outputChannelName);
}
}
@@ -94,7 +98,10 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdapter
for (Object item : array) {
Message<?> splitMessage = (item instanceof Message<?>) ?
(Message<?>) item : this.createReplyMessage(item, originalMessage);
this.prepareMessage(splitMessage, originalMessage.getId(), ++sequenceNumber, sequenceSize);
splitMessage = MessageBuilder.fromMessage(splitMessage)
.setCorrelationId(originalMessage.getId())
.setSequenceNumber(++sequenceNumber)
.setSequenceSize(sequenceSize).build();
this.sendMessage(splitMessage, this.outputChannelName);
}
}
@@ -105,12 +112,6 @@ public class SplitterMessageHandlerAdapter extends AbstractMessageHandlerAdapter
return null;
}
private void prepareMessage(Message<?> message, Object correlationId, int sequenceNumber, int sequenceSize) {
message.getHeader().setCorrelationId(correlationId);
message.getHeader().setSequenceNumber(sequenceNumber);
message.getHeader().setSequenceSize(sequenceSize);
}
private boolean sendMessage(Message<?> message, String channelName) {
ChannelRegistry channelRegistry = this.getChannelRegistry();
if (channelRegistry == null) {

View File

@@ -22,8 +22,8 @@ import java.util.Properties;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.handler.annotation.AnnotationMethodMessageMapper;
import org.springframework.integration.message.DefaultMessageMapper;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageMapper;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.util.AbstractMethodInvokingAdapter;
@@ -82,25 +82,28 @@ public class AnnotationMethodTransformerAdapter extends AbstractMethodInvokingAd
}
if (result instanceof Properties && !(message.getPayload() instanceof Properties)) {
Properties propertiesToSet = (Properties) result;
MessageBuilder builder = MessageBuilder.fromMessage(message);
for (Object keyObject : propertiesToSet.keySet()) {
String key = (String) keyObject;
message.getHeader().setProperty(key, propertiesToSet.getProperty(key));
builder.setHeader(key, propertiesToSet.getProperty(key));
}
return builder.build();
}
else if (result instanceof Map && !(message.getPayload() instanceof Map)) {
Map<String, ?> attributesToSet = (Map) result;
MessageBuilder builder = MessageBuilder.fromMessage(message);
for (String key : attributesToSet.keySet()) {
message.getHeader().setAttribute(key, attributesToSet.get(key));
builder.setHeader(key, attributesToSet.get(key));
}
return builder.build();
}
else {
return new GenericMessage(result, message.getHeader());
return MessageBuilder.fromPayload(result).copyHeadersFromMessage(message).build();
}
}
catch (Exception e) {
throw new MessagingException(message, "failed to transform message payload", e);
}
return message;
}
public Message<?> handle(Message<?> message) {

View File

@@ -16,8 +16,8 @@
package org.springframework.integration.transformer;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.util.AbstractMethodInvokingAdapter;
@@ -30,7 +30,7 @@ public class PayloadTransformerAdapter extends AbstractMethodInvokingAdapter imp
public Message<?> transform(Message<?> message) {
try {
Object result = this.invokeMethod(message.getPayload());
return new GenericMessage(result, message.getHeader());
return MessageBuilder.fromPayload(result).copyHeadersFromMessage(message).build();
} catch (Exception e) {
throw new MessagingException(message, "failed to transform message payload", e);
}

View File

@@ -36,6 +36,7 @@ import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.message.ErrorMessage;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageSource;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.scheduling.PollingSchedule;
@@ -51,8 +52,8 @@ public class DefaultMessageBusTests {
MessageChannel sourceChannel = new QueueChannel();
MessageChannel targetChannel = new QueueChannel();
bus.registerChannel("sourceChannel", sourceChannel);
StringMessage message = new StringMessage("test");
message.getHeader().setReturnAddress("targetChannel");
Message<String> message = MessageBuilder.fromPayload("test")
.setReturnAddress("targetChannel").build();
sourceChannel.send(message);
bus.registerChannel("targetChannel", targetChannel);
MessageHandler handler = new MessageHandler() {
@@ -73,8 +74,8 @@ public class DefaultMessageBusTests {
MessageChannel sourceChannel = new QueueChannel();
MessageChannel targetChannel = new QueueChannel();
bus.registerChannel("sourceChannel", sourceChannel);
StringMessage message = new StringMessage("test");
message.getHeader().setReturnAddress("targetChannel");
Message<String> message = MessageBuilder.fromPayload("test")
.setReturnAddress("targetChannel").build();
sourceChannel.send(message);
bus.registerChannel("targetChannel", targetChannel);
MessageHandler handler = new MessageHandler() {
@@ -93,7 +94,7 @@ public class DefaultMessageBusTests {
public void testChannelsWithoutHandlers() {
MessageBus bus = new DefaultMessageBus();
MessageChannel sourceChannel = new QueueChannel();
sourceChannel.send(new StringMessage("123", "test"));
sourceChannel.send(new StringMessage("test"));
MessageChannel targetChannel = new QueueChannel();
bus.registerChannel("sourceChannel", sourceChannel);
bus.registerChannel("targetChannel", targetChannel);
@@ -108,7 +109,7 @@ public class DefaultMessageBusTests {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("messageBusTests.xml", this.getClass());
context.start();
MessageChannel sourceChannel = (MessageChannel) context.getBean("sourceChannel");
sourceChannel.send(new GenericMessage<String>("123", "test"));
sourceChannel.send(new GenericMessage<String>("test"));
MessageChannel targetChannel = (MessageChannel) context.getBean("targetChannel");
MessageBus bus = (MessageBus) context.getBean("bus");
bus.start();
@@ -123,14 +124,14 @@ public class DefaultMessageBusTests {
QueueChannel outputChannel2 = new QueueChannel();
MessageHandler handler1 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReturnAddress("output1");
return message;
return MessageBuilder.fromMessage(message)
.setReturnAddress("output1").build();
}
};
MessageHandler handler2 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReturnAddress("output2");
return message;
return MessageBuilder.fromMessage(message)
.setReturnAddress("output2").build();
}
};
MessageBus bus = new DefaultMessageBus();
@@ -140,8 +141,8 @@ public class DefaultMessageBusTests {
bus.registerHandler("handler1", handler1, inputChannel, null);
bus.registerHandler("handler2", handler2, inputChannel, null);
bus.start();
inputChannel.send(new StringMessage(1, "testing"));
Message<?> message1 = outputChannel1.receive(100);
inputChannel.send(new StringMessage("testing"));
Message<?> message1 = outputChannel1.receive(500);
Message<?> message2 = outputChannel2.receive(0);
bus.stop();
assertTrue("exactly one message should be null", message1 == null ^ message2 == null);
@@ -155,16 +156,18 @@ public class DefaultMessageBusTests {
final CountDownLatch latch = new CountDownLatch(2);
MessageHandler handler1 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReturnAddress("output1");
Message<?> reply = MessageBuilder.fromMessage(message)
.setReturnAddress("output1").build();
latch.countDown();
return message;
return reply;
}
};
MessageHandler handler2 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReturnAddress("output2");
Message<?> reply = MessageBuilder.fromMessage(message)
.setReturnAddress("output2").build();
latch.countDown();
return message;
return reply;
}
};
MessageBus bus = new DefaultMessageBus();
@@ -174,7 +177,7 @@ public class DefaultMessageBusTests {
bus.registerHandler("handler1", handler1, inputChannel, null);
bus.registerHandler("handler2", handler2, inputChannel, null);
bus.start();
inputChannel.send(new StringMessage(1, "testing"));
inputChannel.send(new StringMessage("testing"));
latch.await(500, TimeUnit.MILLISECONDS);
assertEquals("both handlers should have been invoked", 0, latch.getCount());
Message<?> message1 = outputChannel1.receive(500);

View File

@@ -25,6 +25,7 @@ import java.util.Comparator;
import org.junit.Test;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessagePriority;
import org.springframework.integration.message.StringMessage;
@@ -84,11 +85,23 @@ public class PriorityChannelTests {
assertEquals("E", channel.receive(0).getPayload());
}
@Test
public void testNullPriorityIsConsideredNormal() {
PriorityChannel channel = new PriorityChannel(5);
Message<?> highPriority = createPriorityMessage(MessagePriority.HIGH);
Message<?> lowPriority = createPriorityMessage(MessagePriority.LOW);
Message<?> nullPriority = new StringMessage("test-NULL");
channel.send(lowPriority);
channel.send(highPriority);
channel.send(nullPriority);
assertEquals("test-HIGH", channel.receive(0).getPayload());
assertEquals("test-NULL", channel.receive(0).getPayload());
assertEquals("test-LOW", channel.receive(0).getPayload());
}
private static Message<?> createPriorityMessage(MessagePriority priority) {
Message<?> message = new StringMessage("test-" + priority);
message.getHeader().setPriority(priority);
return message;
private static Message<String> createPriorityMessage(MessagePriority priority) {
return MessageBuilder.fromPayload("test-" + priority).setPriority(priority).build();
}

View File

@@ -33,6 +33,7 @@ import org.junit.Test;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.selector.UnexpiredMessageSelector;
@@ -56,7 +57,7 @@ public class QueueChannelTests {
}
}).start();
assertFalse(messageReceived.get());
channel.send(new GenericMessage<String>(1, "testing"));
channel.send(new GenericMessage<String>("testing"));
latch.await(25, TimeUnit.MILLISECONDS);
assertTrue(messageReceived.get());
}
@@ -79,7 +80,7 @@ public class QueueChannelTests {
};
Runnable sendTask = new Runnable() {
public void run() {
channel.send(new GenericMessage<String>(1, "testing"));
channel.send(new GenericMessage<String>("testing"));
}
};
singleThreadExecutor.execute(receiveTask1);
@@ -143,26 +144,26 @@ public class QueueChannelTests {
@Test
public void testImmediateSend() {
QueueChannel channel = new QueueChannel(3);
boolean result1 = channel.send(new GenericMessage<String>(1, "test-1"));
boolean result1 = channel.send(new GenericMessage<String>("test-1"));
assertTrue(result1);
boolean result2 = channel.send(new GenericMessage<String>(2, "test-2"), 100);
boolean result2 = channel.send(new GenericMessage<String>("test-2"), 100);
assertTrue(result2);
boolean result3 = channel.send(new GenericMessage<String>(3, "test-3"), 0);
boolean result3 = channel.send(new GenericMessage<String>("test-3"), 0);
assertTrue(result3);
boolean result4 = channel.send(new GenericMessage<String>(4, "test-4"), 0);
boolean result4 = channel.send(new GenericMessage<String>("test-4"), 0);
assertFalse(result4);
}
@Test
public void testBlockingSendWithNoTimeout() throws Exception{
final QueueChannel channel = new QueueChannel(1);
boolean result1 = channel.send(new GenericMessage<String>(1, "test-1"));
boolean result1 = channel.send(new GenericMessage<String>("test-1"));
assertTrue(result1);
final AtomicBoolean sendInterrupted = new AtomicBoolean(false);
final CountDownLatch latch = new CountDownLatch(1);
Thread t = new Thread(new Runnable() {
public void run() {
channel.send(new GenericMessage<String>(2, "test-2"));
channel.send(new GenericMessage<String>("test-2"));
sendInterrupted.set(true);
latch.countDown();
}
@@ -177,13 +178,13 @@ public class QueueChannelTests {
@Test
public void testBlockingSendWithTimeout() throws Exception{
final QueueChannel channel = new QueueChannel(1);
boolean result1 = channel.send(new GenericMessage<String>(1, "test-1"));
boolean result1 = channel.send(new GenericMessage<String>("test-1"));
assertTrue(result1);
final AtomicBoolean sendInterrupted = new AtomicBoolean(false);
final CountDownLatch latch = new CountDownLatch(1);
Thread t = new Thread(new Runnable() {
public void run() {
channel.send(new GenericMessage<String>(2, "test-2"), 10000);
channel.send(new GenericMessage<String>("test-2"), 10000);
sendInterrupted.set(true);
latch.countDown();
}
@@ -225,10 +226,10 @@ public class QueueChannelTests {
long time = System.currentTimeMillis();
Date past = new Date(time - minute);
Date future = new Date(time + minute);
StringMessage expiredMessage = new StringMessage("test1");
expiredMessage.getHeader().setExpiration(past);
StringMessage unexpiredMessage = new StringMessage("test2");
unexpiredMessage.getHeader().setExpiration(future);
Message<String> expiredMessage = MessageBuilder.fromPayload("test1")
.setExpirationDate(past).build();
Message<String> unexpiredMessage = MessageBuilder.fromPayload("test2")
.setExpirationDate(future).build();
assertTrue(channel.send(expiredMessage, 0));
assertTrue(channel.send(unexpiredMessage, 0));
assertFalse(channel.send(new StringMessage("atCapacity"), 0));

View File

@@ -32,6 +32,7 @@ import org.springframework.integration.config.TestChannelInterceptor;
import org.springframework.integration.dispatcher.PublishSubscribeChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageDeliveryException;
import org.springframework.integration.message.MessagePriority;
import org.springframework.integration.message.StringMessage;
@@ -52,10 +53,10 @@ public class ChannelParserTests {
"channelParserTests.xml", this.getClass());
MessageChannel channel = (MessageChannel) context.getBean("capacityChannel");
for (int i = 0; i < 10; i++) {
boolean result = channel.send(new GenericMessage<String>(1, "test"), 10);
boolean result = channel.send(new GenericMessage<String>("test"), 10);
assertTrue(result);
}
assertFalse(channel.send(new GenericMessage<String>(1, "test"), 3));
assertFalse(channel.send(new GenericMessage<String>("test"), 3));
}
@Test
@@ -148,12 +149,12 @@ public class ChannelParserTests {
ApplicationContext context = new ClassPathXmlApplicationContext(
"priorityChannelParserTests.xml", this.getClass());
MessageChannel channel = (MessageChannel) context.getBean("priorityChannelWithDefaultComparator");
Message<?> lowPriorityMessage = new StringMessage("low");
lowPriorityMessage.getHeader().setPriority(MessagePriority.LOW);
Message<?> midPriorityMessage = new StringMessage("mid");
midPriorityMessage.getHeader().setPriority(MessagePriority.NORMAL);
Message<?> highPriorityMessage = new StringMessage("high");
highPriorityMessage.getHeader().setPriority(MessagePriority.HIGH);
Message<String> lowPriorityMessage = MessageBuilder.fromPayload("low")
.setPriority(MessagePriority.LOW).build();
Message<String> midPriorityMessage = MessageBuilder.fromPayload("mid")
.setPriority(MessagePriority.NORMAL).build();
Message<String> highPriorityMessage = MessageBuilder.fromPayload("high")
.setPriority(MessagePriority.HIGH).build();
channel.send(lowPriorityMessage);
channel.send(highPriorityMessage);
channel.send(midPriorityMessage);

View File

@@ -30,6 +30,7 @@ import org.junit.Test;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
/**
@@ -47,15 +48,16 @@ public class ChannelInterceptorTests {
Message<?> result = channel.receive(0);
assertNotNull(result);
assertEquals("test", result.getPayload());
assertEquals(1, result.getHeader().getAttribute(PreSendReturnsMessageInterceptor.class.getName()));
assertEquals(1, result.getHeaders().get(PreSendReturnsMessageInterceptor.class.getName()));
}
@Test
public void testPreSendInterceptorReturnsNull() {
channel.addInterceptor(new PreSendReturnsNullInterceptor());
PreSendReturnsNullInterceptor interceptor = new PreSendReturnsNullInterceptor();
channel.addInterceptor(interceptor);
Message<?> message = new StringMessage("test");
channel.send(message);
assertEquals(1, message.getHeader().getAttribute(PreSendReturnsNullInterceptor.class.getName()));
assertEquals(1, interceptor.getCount());
Message<?> result = channel.receive(0);
assertNull(result);
}
@@ -158,8 +160,9 @@ public class ChannelInterceptorTests {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
assertNotNull(message);
message.getHeader().setAttribute(this.getClass().getName(), counter.incrementAndGet());
return message;
Message<?> reply = MessageBuilder.fromMessage(message)
.setHeader(this.getClass().getName(), counter.incrementAndGet()).build();
return reply;
}
}
@@ -168,10 +171,14 @@ public class ChannelInterceptorTests {
private static AtomicInteger counter = new AtomicInteger();
protected int getCount() {
return counter.get();
}
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
assertNotNull(message);
message.getHeader().setAttribute(this.getClass().getName(), counter.incrementAndGet());
counter.incrementAndGet();
return null;
}
}

View File

@@ -29,6 +29,7 @@ import org.junit.Test;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.selector.MessageSelector;
@@ -100,7 +101,7 @@ public class WireTapTests {
mainChannel.send(new StringMessage("testing"));
Message<?> original = mainChannel.receive(0);
Message<?> duplicate = secondaryChannel.receive(0);
Object originalIdAttribute = duplicate.getHeader().getAttribute(WireTap.ORIGINAL_MESSAGE_ID_KEY);
Object originalIdAttribute = duplicate.getHeaders().get(WireTap.ORIGINAL_MESSAGE_ID_KEY);
assertNotNull(originalIdAttribute);
assertEquals(original.getId(), originalIdAttribute);
}
@@ -116,46 +117,26 @@ public class WireTapTests {
Message<?> original = mainChannel.receive(0);
Message<?> duplicate = secondaryChannel.receive(0);
assertTrue("original timestamp should precede duplicate",
original.getHeader().getTimestamp() < duplicate.getHeader().getTimestamp());
original.getHeaders().getTimestamp() < duplicate.getHeaders().getTimestamp());
}
public void testDuplicateMessageContainsAttribute() {
public void testDuplicateMessageContainsHeaderValue() {
QueueChannel mainChannel = new QueueChannel();
QueueChannel secondaryChannel = new QueueChannel();
mainChannel.addInterceptor(new WireTap(secondaryChannel));
Message<?> message = new StringMessage("testing");
String attributeKey = "testAttribute";
Integer attributeValue = new Integer(123);
message.getHeader().setAttribute(attributeKey, attributeValue);
String headerName = "testAttribute";
Message<String> message = MessageBuilder.fromPayload("testing")
.setHeader(headerName, new Integer(123)).build();
mainChannel.send(message);
Message<?> original = mainChannel.receive(0);
Message<?> duplicate = secondaryChannel.receive(0);
Object originalAttribute = original.getHeader().getAttribute(attributeKey);
Object duplicateAttribute = duplicate.getHeader().getAttribute(attributeKey);
Object originalAttribute = original.getHeaders().get(headerName);
Object duplicateAttribute = duplicate.getHeaders().get(headerName);
assertNotNull(originalAttribute);
assertNotNull(duplicateAttribute);
assertEquals(originalAttribute, duplicateAttribute);
}
@Test
public void testDuplicateMessageContainsProperty() {
QueueChannel mainChannel = new QueueChannel();
QueueChannel secondaryChannel = new QueueChannel();
mainChannel.addInterceptor(new WireTap(secondaryChannel));
Message<?> message = new StringMessage("testing");
String propertyKey = "testProperty";
String propertyValue = "foo";
message.getHeader().setProperty(propertyKey, propertyValue);
mainChannel.send(message);
Message<?> original = mainChannel.receive(0);
Message<?> duplicate = secondaryChannel.receive(0);
String originalProperty = original.getHeader().getProperty(propertyKey);
String duplicateProperty = duplicate.getHeader().getProperty(propertyKey);
assertNotNull(originalProperty);
assertNotNull(duplicateProperty);
assertEquals(originalProperty, duplicateProperty);
}
private static class TestSelector implements MessageSelector {

View File

@@ -30,8 +30,8 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.endpoint.HandlerEndpoint;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.router.AggregatingMessageHandler;
import org.springframework.integration.router.CompletionStrategy;
import org.springframework.integration.router.CompletionStrategyAdapter;
@@ -161,12 +161,11 @@ public class AggregatorParserTests {
private static <T> Message<T> createMessage(T payload, Object correlationId, int sequenceSize, int sequenceNumber,
MessageChannel replyChannel) {
GenericMessage<T> message = new GenericMessage<T>(payload);
message.getHeader().setCorrelationId(correlationId);
message.getHeader().setSequenceSize(sequenceSize);
message.getHeader().setSequenceNumber(sequenceNumber);
message.getHeader().setReturnAddress(replyChannel);
return message;
return MessageBuilder.fromPayload(payload)
.setCorrelationId(correlationId)
.setSequenceSize(sequenceSize)
.setSequenceNumber(sequenceNumber)
.setReturnAddress(replyChannel).build();
}
}

View File

@@ -30,6 +30,7 @@ import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageRejectedException;
import org.springframework.integration.message.MessageTarget;
import org.springframework.integration.message.StringMessage;
@@ -47,7 +48,7 @@ public class EndpointParserTests {
MessageChannel channel = (MessageChannel) context.getBean("testChannel");
TestHandler handler = (TestHandler) context.getBean("testHandler");
assertNull(handler.getMessageString());
channel.send(new GenericMessage<String>(1, "test"));
channel.send(new GenericMessage<String>("test"));
handler.getLatch().await(500, TimeUnit.MILLISECONDS);
assertEquals("test", handler.getMessageString());
}
@@ -60,7 +61,7 @@ public class EndpointParserTests {
MessageChannel channel = (MessageChannel) context.getBean("testChannel");
TestBean bean = (TestBean) context.getBean("testBean");
assertNull(bean.getMessage());
channel.send(new GenericMessage<String>(1, "test"));
channel.send(new GenericMessage<String>("test"));
bean.getLatch().await(500, TimeUnit.MILLISECONDS);
assertEquals("test", bean.getMessage());
}
@@ -82,9 +83,9 @@ public class EndpointParserTests {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"endpointWithSelector.xml", this.getClass());
MessageTarget endpoint = (MessageTarget) context.getBean("endpoint");
Message<?> message = new StringMessage("test");
MessageChannel replyChannel = new QueueChannel();
message.getHeader().setReturnAddress(replyChannel);
Message<?> message = MessageBuilder.fromPayload("test")
.setReturnAddress(replyChannel).build();
assertTrue(endpoint.send(message));
Message<?> reply = replyChannel.receive(500);
assertNotNull(reply);
@@ -96,9 +97,9 @@ public class EndpointParserTests {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"endpointWithSelector.xml", this.getClass());
MessageTarget endpoint = (MessageTarget) context.getBean("endpoint");
Message<?> message = new GenericMessage<Integer>(123);
MessageChannel replyChannel = new QueueChannel();
message.getHeader().setReturnAddress(replyChannel);
Message<?> message = MessageBuilder.fromPayload(123)
.setReturnAddress(replyChannel).build();
endpoint.send(message);
}

View File

@@ -16,7 +16,6 @@
package org.springframework.integration.config;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@@ -25,18 +24,12 @@ import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.router.AggregatingMessageHandler;
import org.springframework.integration.router.CompletionStrategy;
import org.springframework.integration.router.CompletionStrategyAdapter;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.router.ResequencingMessageHandler;
import org.springframework.integration.util.MethodInvoker;
/**
* @author Marius Bogoevici
@@ -51,6 +44,7 @@ public class ResequencerParserTests {
this.context = new ClassPathXmlApplicationContext("resequencerParserTests.xml", this.getClass());
}
@Test
public void testResequencing() {
ResequencingMessageHandler resequencingHandler = (ResequencingMessageHandler) context
@@ -67,13 +61,13 @@ public class ResequencerParserTests {
Message<?> message2 = replyChannel.receive(500);
Message<?> message3 = replyChannel.receive(500);
Assert.assertNotNull(message1);
Assert.assertEquals(1, message1.getHeader().getSequenceNumber());
Assert.assertEquals(new Integer(1), message1.getHeaders().getSequenceNumber());
Assert.assertNotNull(message2);
Assert.assertEquals(2, message2.getHeader().getSequenceNumber());
Assert.assertEquals(new Integer(2), message2.getHeaders().getSequenceNumber());
Assert.assertNotNull(message3);
Assert.assertEquals(3, message3.getHeader().getSequenceNumber());
Assert.assertEquals(new Integer(3), message3.getHeaders().getSequenceNumber());
}
@Test
public void testDefaultResequencerProperties() {
ResequencingMessageHandler resequencingHandler = (ResequencingMessageHandler) context
@@ -126,12 +120,12 @@ public class ResequencerParserTests {
private static <T> Message<T> createMessage(T payload, Object correlationId, int sequenceSize, int sequenceNumber,
MessageChannel replyChannel) {
GenericMessage<T> message = new GenericMessage<T>(payload);
message.getHeader().setCorrelationId(correlationId);
message.getHeader().setSequenceSize(sequenceSize);
message.getHeader().setSequenceNumber(sequenceNumber);
message.getHeader().setReturnAddress(replyChannel);
return message;
return MessageBuilder.fromPayload(payload)
.setCorrelationId(correlationId)
.setSequenceSize(sequenceSize)
.setSequenceNumber(sequenceNumber)
.setReturnAddress(replyChannel)
.build();
}
}

View File

@@ -42,7 +42,7 @@ public class TestAggregator implements Aggregator {
for (Message<?> message : sortableList) {
buffer.append(message.getPayload().toString());
if (null == correlationId) {
correlationId = message.getHeader().getCorrelationId();
correlationId = message.getHeaders().getCorrelationId();
}
}
Message<?> returnedMessage = new StringMessage(buffer.toString());

View File

@@ -18,7 +18,6 @@ package org.springframework.integration.config;
import org.springframework.integration.handler.ReplyHandler;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageHeader;
/**
* @author Mark Fisher
@@ -28,7 +27,7 @@ public class TestReplyHandler implements ReplyHandler {
private volatile Message<?> lastMessage;
public void handle(Message<?> replyMessage, MessageHeader originalMessageHeader) {
public void handle(Message<?> replyMessage, Message<?> originalMessage) {
this.lastMessage = replyMessage;
}

View File

@@ -48,7 +48,7 @@ public class TestAnnotatedEndpointWithCompletionStrategy {
for (Message<?> message : sortableList) {
buffer.append(message.getPayload().toString());
if (null == correlationId) {
correlationId = message.getHeader().getCorrelationId();
correlationId = message.getHeaders().getCorrelationId();
}
}
Message<?> returnedMessage = new StringMessage(buffer.toString());

View File

@@ -49,7 +49,7 @@ public class TestAnnotatedEndpointWithCustomizedAggregator {
for (Message<?> message : sortableList) {
buffer.append(message.getPayload().toString());
if (null == correlationId) {
correlationId = message.getHeader().getCorrelationId();
correlationId = message.getHeaders().getCorrelationId();
}
}
Message<?> returnedMessage = new StringMessage(buffer.toString());

View File

@@ -47,7 +47,7 @@ public class TestAnnotatedEndpointWithDefaultAggregator {
for (Message<?> message : sortableList) {
buffer.append(message.getPayload().toString());
if (null == correlationId) {
correlationId = message.getHeader().getCorrelationId();
correlationId = message.getHeaders().getCorrelationId();
}
}
Message<?> returnedMessage = new StringMessage(buffer.toString());

View File

@@ -28,9 +28,10 @@ import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageSource;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.MessageTarget;
import org.springframework.integration.message.StringMessage;
/**
* @author Mark Fisher
@@ -43,18 +44,19 @@ public class DirectChannelTests {
@Test
public void testSend() {
DirectChannel channel = new DirectChannel();
channel.subscribe(new ThreadNameSettingTestTarget());
ThreadNameExtractingTestTarget target = new ThreadNameExtractingTestTarget();
channel.subscribe(target);
StringMessage message = new StringMessage("test");
assertTrue(channel.send(message));
String handlerThreadName = message.getHeader().getProperty(HANDLER_THREAD);
assertEquals(Thread.currentThread().getName(), handlerThreadName);
assertEquals(Thread.currentThread().getName(), target.threadName);
}
@Test
public void testSendInSeparateThread() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
final DirectChannel channel = new DirectChannel();
channel.subscribe(new ThreadNameSettingTestTarget(latch));
ThreadNameExtractingTestTarget target = new ThreadNameExtractingTestTarget(latch);
channel.subscribe(target);
final StringMessage message = new StringMessage("test");
new Thread(new Runnable() {
public void run() {
@@ -62,8 +64,7 @@ public class DirectChannelTests {
}
}, "test-thread").start();
latch.await(1000, TimeUnit.MILLISECONDS);
String handlerThreadName = message.getHeader().getProperty(HANDLER_THREAD);
assertEquals("test-thread", handlerThreadName);
assertEquals("test-thread", target.threadName);
}
@Test
@@ -88,7 +89,7 @@ public class DirectChannelTests {
assertNotNull(message.getPayload());
assertEquals(String.class, message.getPayload().getClass());
assertEquals("foo", message.getPayload());
String handlerThreadName = message.getHeader().getProperty(HANDLER_THREAD);
String handlerThreadName = message.getHeaders().get(HANDLER_THREAD, String.class);
assertEquals(Thread.currentThread().getName(), handlerThreadName);
}
@@ -113,7 +114,7 @@ public class DirectChannelTests {
assertNotNull(message.getPayload());
assertEquals(String.class, message.getPayload().getClass());
assertEquals("foo", message.getPayload());
String handlerThreadName = message.getHeader().getProperty(HANDLER_THREAD);
String handlerThreadName = message.getHeaders().get(HANDLER_THREAD, String.class);
assertEquals("test-thread", handlerThreadName);
}
@@ -124,21 +125,23 @@ public class DirectChannelTests {
}
private static class ThreadNameSettingTestTarget implements MessageTarget {
private static class ThreadNameExtractingTestTarget implements MessageTarget {
private String threadName;
private final CountDownLatch latch;
ThreadNameSettingTestTarget() {
ThreadNameExtractingTestTarget() {
this(null);
}
ThreadNameSettingTestTarget(CountDownLatch latch) {
ThreadNameExtractingTestTarget(CountDownLatch latch) {
this.latch = latch;
}
public boolean send(Message<?> message) {
message.getHeader().setProperty(HANDLER_THREAD, Thread.currentThread().getName());
this.threadName = Thread.currentThread().getName();
if (this.latch != null) {
this.latch.countDown();
}
@@ -156,10 +159,9 @@ public class DirectChannelTests {
this.messageText = messageText;
}
public StringMessage receive() {
StringMessage message = new StringMessage(messageText);
message.getHeader().setProperty(HANDLER_THREAD, Thread.currentThread().getName());
return message;
public Message<String> receive() {
return MessageBuilder.fromPayload(messageText)
.setHeader(HANDLER_THREAD, Thread.currentThread().getName()).build();
}
}

View File

@@ -35,6 +35,7 @@ import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.handler.TestHandlers;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageRejectedException;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.selector.MessageSelector;
@@ -52,13 +53,13 @@ public class HandlerEndpointTests {
channelRegistry.registerChannel("replyChannel", replyChannel);
MessageHandler handler = new MessageHandler() {
public Message<String> handle(Message<?> message) {
return new StringMessage("123", "hello " + message.getPayload());
return new StringMessage("hello " + message.getPayload());
}
};
HandlerEndpoint endpoint = new HandlerEndpoint(handler);
endpoint.setChannelRegistry(channelRegistry);
endpoint.setOutputChannelName("replyChannel");
endpoint.send(new StringMessage(1, "test"));
endpoint.send(new StringMessage("test"));
Message<?> reply = replyChannel.receive(50);
assertNotNull(reply);
assertEquals("hello test", reply.getPayload());
@@ -69,12 +70,12 @@ public class HandlerEndpointTests {
final MessageChannel replyChannel = new QueueChannel();
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
return new StringMessage("123", "hello " + message.getPayload());
return new StringMessage("hello " + message.getPayload());
}
};
HandlerEndpoint endpoint = new HandlerEndpoint(handler);
StringMessage testMessage = new StringMessage(1, "test");
testMessage.getHeader().setReturnAddress(replyChannel);
Message<String> testMessage = MessageBuilder.fromPayload("test")
.setReturnAddress(replyChannel).build();
endpoint.send(testMessage);
Message<?> reply = replyChannel.receive(50);
assertNotNull(reply);
@@ -88,13 +89,13 @@ public class HandlerEndpointTests {
channelRegistry.registerChannel("replyChannel", replyChannel);
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
return new StringMessage("123", "hello " + message.getPayload());
return new StringMessage("hello " + message.getPayload());
}
};
HandlerEndpoint endpoint = new HandlerEndpoint(handler);
endpoint.setChannelRegistry(channelRegistry);
StringMessage testMessage = new StringMessage(1, "test");
testMessage.getHeader().setReturnAddress("replyChannel");
Message<String> testMessage = MessageBuilder.fromPayload("test")
.setReturnAddress(replyChannel).build();
endpoint.send(testMessage);
Message<?> reply = replyChannel.receive(50);
assertNotNull(reply);
@@ -109,21 +110,22 @@ public class HandlerEndpointTests {
channelRegistry.registerChannel("replyChannel2", replyChannel2);
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
return new StringMessage("123", "hello " + message.getPayload());
return new StringMessage("hello " + message.getPayload());
}
};
HandlerEndpoint endpoint = new HandlerEndpoint(handler);
endpoint.setChannelRegistry(channelRegistry);
StringMessage testMessage = new StringMessage("test");
testMessage.getHeader().setReturnAddress(replyChannel1);
endpoint.send(testMessage);
Message<String> testMessage1 = MessageBuilder.fromPayload("test")
.setReturnAddress(replyChannel1).build();
endpoint.send(testMessage1);
Message<?> reply1 = replyChannel1.receive(50);
assertNotNull(reply1);
assertEquals("hello test", reply1.getPayload());
Message<?> reply2 = replyChannel2.receive(0);
assertNull(reply2);
testMessage.getHeader().setReturnAddress("replyChannel2");
endpoint.send(testMessage);
Message<String> testMessage2 = MessageBuilder.fromMessage(testMessage1)
.setReturnAddress("replyChannel2").build();
endpoint.send(testMessage2);
reply1 = replyChannel1.receive(0);
assertNull(reply1);
reply2 = replyChannel2.receive(0);
@@ -146,7 +148,7 @@ public class HandlerEndpointTests {
HandlerEndpoint endpoint = new HandlerEndpoint(handler);
endpoint.setChannelRegistry(channelRegistry);
endpoint.setOutputChannelName("replyChannel");
endpoint.send(new StringMessage(1, "test"));
endpoint.send(new StringMessage("test"));
latch.await(500, TimeUnit.MILLISECONDS);
assertEquals("handler should have been invoked within allotted time", 0, latch.getCount());
Message<?> reply = replyChannel.receive(0);
@@ -268,11 +270,11 @@ public class HandlerEndpointTests {
return message;
}
});
Message<?> message = new StringMessage("test");
message.getHeader().setReturnAddress(replyChannel);
Message<String> message = MessageBuilder.fromPayload("test")
.setReturnAddress(replyChannel).build();
endpoint.send(message);
Message<?> reply = replyChannel.receive(500);
assertEquals(message.getId(), reply.getHeader().getCorrelationId());
assertEquals(message.getId(), reply.getHeaders().getCorrelationId());
}
@Test
@@ -280,15 +282,15 @@ public class HandlerEndpointTests {
QueueChannel replyChannel = new QueueChannel(1);
HandlerEndpoint endpoint = new HandlerEndpoint(new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setCorrelationId("ABC-123");
return message;
return MessageBuilder.fromMessage(message)
.setCorrelationId("ABC-123").build();
}
});
Message<?> message = new StringMessage("test");
message.getHeader().setReturnAddress(replyChannel);
Message<String> message = MessageBuilder.fromPayload("test")
.setReturnAddress(replyChannel).build();
endpoint.send(message);
Message<?> reply = replyChannel.receive(500);
Object correlationId = reply.getHeader().getCorrelationId();
Object correlationId = reply.getHeaders().getCorrelationId();
assertFalse(message.getId().equals(correlationId));
assertEquals("ABC-123", correlationId);
}

View File

@@ -24,6 +24,7 @@ import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
/**
@@ -38,8 +39,8 @@ public class ReturnAddressTests {
MessageChannel channel1 = (MessageChannel) context.getBean("channel1WithOverride");
MessageChannel replyChannel = (MessageChannel) context.getBean("replyChannel");
context.start();
StringMessage message = new StringMessage("*");
message.getHeader().setReturnAddress("replyChannel");
Message<String> message = MessageBuilder.fromPayload("*")
.setReturnAddress("replyChannel").build();
channel1.send(message);
Message<?> response = replyChannel.receive(3000);
assertNotNull(response);
@@ -53,8 +54,8 @@ public class ReturnAddressTests {
MessageChannel channel1 = (MessageChannel) context.getBean("channel1");
MessageChannel replyChannel = (MessageChannel) context.getBean("replyChannel");
context.start();
StringMessage message = new StringMessage("*");
message.getHeader().setReturnAddress("replyChannel");
Message<String> message = MessageBuilder.fromPayload("*")
.setReturnAddress("replyChannel").build();
channel1.send(message);
Message<?> response = replyChannel.receive(3000);
assertNotNull(response);

View File

@@ -80,7 +80,7 @@ public class GatewayProxyFactoryBeanTests {
public void run() {
Message<?> input = requestChannel.receive();
StringMessage response = new StringMessage(input.getPayload() + "456");
((MessageChannel) input.getHeader().getReturnAddress()).send(response);
((MessageChannel) input.getHeaders().getReturnAddress()).send(response);
}
}).start();
GatewayProxyFactoryBean proxyFactory = new GatewayProxyFactoryBean();
@@ -133,7 +133,7 @@ public class GatewayProxyFactoryBeanTests {
public void run() {
Message<?> input = requestChannel.receive();
StringMessage response = new StringMessage(input.getPayload() + "bar");
((MessageChannel) input.getHeader().getReturnAddress()).send(response);
((MessageChannel) input.getHeaders().getReturnAddress()).send(response);
}
}).start();
GatewayProxyFactoryBean proxyFactory = new GatewayProxyFactoryBean();
@@ -177,7 +177,7 @@ public class GatewayProxyFactoryBeanTests {
public void run() {
Message<?> input = requestChannel.receive();
StringMessage response = new StringMessage(input.getPayload() + "bar");
((MessageChannel) input.getHeader().getReturnAddress()).send(response);
((MessageChannel) input.getHeaders().getReturnAddress()).send(response);
}
}).start();
}

View File

@@ -32,7 +32,6 @@ import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.handler.ReplyHandler;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.message.StringMessage;
/**
@@ -68,7 +67,7 @@ public class RequestReplyTemplateTests {
final List<String> replies = new ArrayList<String>(3);
final CountDownLatch latch = new CountDownLatch(3);
ReplyHandler replyHandler = new ReplyHandler() {
public void handle(Message<?> replyMessage, MessageHeader originalMessageHeader) {
public void handle(Message<?> replyMessage, Message<?> originalMessage) {
replies.add((String) replyMessage.getPayload());
latch.countDown();
}

View File

@@ -27,13 +27,14 @@ import static org.junit.Assert.assertEquals;
import org.easymock.IAnswer;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.integration.bus.MessageBus;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageDeliveryException;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.message.MessageHeaders;
import org.springframework.integration.message.MessageMapper;
/**
@@ -150,22 +151,23 @@ public class SimpleMessagingGatewayTests {
}
@Test
@Ignore
public void sendMessageAndReceiveObject() {
// setup local mocks
MessageHeader messageHeaderMock = createMock(MessageHeader.class);
MessageHeaders messageHeadersMock = createMock(MessageHeaders.class);
//set expectations
messageHeaderMock.setReturnAddress(replyChannel);
//messageHeaderMock.setReturnAddress(replyChannel);
expect(replyChannel.getName()).andReturn("replyChannel").anyTimes();
expect(messageMock.getHeader()).andReturn(messageHeaderMock);
expect(messageMock.getHeaders()).andReturn(messageHeadersMock);
expect(requestChannel.send(messageMock)).andReturn(true);
expect(messageMock.getId()).andReturn(1);
//play scenario
replay(allmocks);
replay(messageHeaderMock);
replay(messageHeadersMock);
this.simpleMessagingGateway.sendAndReceive(messageMock);
verify(allmocks);
verify(messageHeaderMock);
verify(messageHeadersMock);
}
@Test
@@ -186,13 +188,14 @@ public class SimpleMessagingGatewayTests {
}
@Test
@Ignore
public void sendMessageAndReceiveMessage() {
// setup local mocks
MessageHeader messageHeaderMock = createMock(MessageHeader.class);
MessageHeaders messageHeadersMock = createMock(MessageHeaders.class);
//set expectations
messageHeaderMock.setReturnAddress(replyChannel);
expect(replyChannel.getName()).andReturn("replyChannel").anyTimes();
expect(messageMock.getHeader()).andReturn(messageHeaderMock);
expect(messageMock.getHeaders()).andReturn(messageHeadersMock);
expect(messageHeadersMock.getReturnAddress()).andReturn(replyChannel);
expect(requestChannel.send(messageMock)).andReturn(true);
expect(messageMock.getId()).andReturn(1);

View File

@@ -27,6 +27,7 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.gateway.TestService;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
/**
@@ -92,8 +93,8 @@ public class GatewayParserTests {
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
Message<?> request = requestChannel.receive();
Message<?> reply = new StringMessage(request.getPayload() + "bar");
reply.getHeader().setCorrelationId(request.getId());
Message<String> reply = MessageBuilder.fromPayload(request.getPayload() + "bar")
.setCorrelationId(request.getId()).build();
replyChannel.send(reply);
}
});

View File

@@ -26,6 +26,7 @@ import org.springframework.integration.channel.DefaultChannelRegistry;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.router.SplitterMessageHandlerAdapter;
@@ -38,58 +39,58 @@ public class CorrelationIdTests {
@Test
public void testCorrelationIdPassedIfAvailable() {
Object correlationId = "123-ABC";
Message<?> message = new StringMessage("test");
message.getHeader().setCorrelationId(correlationId);
Message<String> message = MessageBuilder.fromPayload("test")
.setCorrelationId(correlationId).build();
DefaultMessageHandlerAdapter adapter = new DefaultMessageHandlerAdapter();
adapter.setObject(new TestBean());
adapter.setMethodName("upperCase");
adapter.afterPropertiesSet();
Message<?> reply = adapter.handle(message);
assertEquals(correlationId, reply.getHeader().getCorrelationId());
assertEquals(correlationId, reply.getHeaders().getCorrelationId());
}
@Test
public void testCorrelationIdCopiedFromMessageIdByDefault() {
Message<?> message = new StringMessage("test");
Message<String> message = MessageBuilder.fromPayload("test").build();
DefaultMessageHandlerAdapter adapter = new DefaultMessageHandlerAdapter();
adapter.setObject(new TestBean());
adapter.setMethodName("upperCase");
adapter.afterPropertiesSet();
Message<?> reply = adapter.handle(message);
assertEquals(message.getId(), reply.getHeader().getCorrelationId());
assertEquals(message.getId(), reply.getHeaders().getCorrelationId());
}
@Test
public void testCorrelationIdCopiedFromMessageCorrelationIdIfAvailable() {
Message<?> message = new StringMessage("messageId","test");
message.getHeader().setCorrelationId("correlationId");
Message<String> message = MessageBuilder.fromPayload("test")
.setCorrelationId("correlationId").build();
DefaultMessageHandlerAdapter adapter = new DefaultMessageHandlerAdapter();
adapter.setObject(new TestBean());
adapter.setMethodName("upperCase");
adapter.afterPropertiesSet();
Message<?> reply = adapter.handle(message);
assertEquals(message.getHeader().getCorrelationId(), reply.getHeader().getCorrelationId());
assertTrue(message.getHeader().getCorrelationId().equals(reply.getHeader().getCorrelationId()));
assertEquals(message.getHeaders().getCorrelationId(), reply.getHeaders().getCorrelationId());
assertTrue(message.getHeaders().getCorrelationId().equals(reply.getHeaders().getCorrelationId()));
}
@Test
public void testCorrelationNotPassedIfAlreadySetByHandler() throws Exception {
Object correlationId = "123-ABC";
Message<?> message = new StringMessage("test");
message.getHeader().setCorrelationId(correlationId);
Message<String> message = MessageBuilder.fromPayload("test")
.setCorrelationId(correlationId).build();
AbstractMessageHandlerAdapter adapter = new AbstractMessageHandlerAdapter() {
@Override
protected Message<?> handleReturnValue(Object returnValue, Message<?> originalMessage) {
Message<?> resultMessage = this.createReplyMessage(returnValue, originalMessage);
resultMessage.getHeader().setCorrelationId("456-XYZ");
return resultMessage;
return MessageBuilder.fromMessage(resultMessage)
.setCorrelationId("456-XYZ").build();
}
};
adapter.setObject(new TestBean());
adapter.setMethodName("upperCase");
adapter.afterPropertiesSet();
Message<?> reply = adapter.handle(message);
assertEquals("456-XYZ", reply.getHeader().getCorrelationId());
assertEquals("456-XYZ", reply.getHeaders().getCorrelationId());
}
@Test
@@ -99,15 +100,14 @@ public class CorrelationIdTests {
@Override
protected Message<?> handleReturnValue(Object returnValue, Message<?> originalMessage) {
Message<?> resultMessage = this.createReplyMessage(returnValue, originalMessage);
resultMessage.getHeader().setCorrelationId("456-XYZ");
return resultMessage;
return MessageBuilder.fromMessage(resultMessage).setCorrelationId("456-XYZ").build();
}
};
adapter.setObject(new TestBean());
adapter.setMethodName("upperCase");
adapter.afterPropertiesSet();
Message<?> reply = adapter.handle(message);
assertEquals("456-XYZ", reply.getHeader().getCorrelationId());
assertEquals("456-XYZ", reply.getHeaders().getCorrelationId());
}
@Test
@@ -128,8 +128,8 @@ public class CorrelationIdTests {
splitter.handle(message);
Message<?> reply1 = testChannel.receive(100);
Message<?> reply2 = testChannel.receive(100);
assertEquals(message.getId(), reply1.getHeader().getCorrelationId());
assertEquals(message.getId(), reply2.getHeader().getCorrelationId());
assertEquals(message.getId(), reply1.getHeaders().getCorrelationId());
assertEquals(message.getId(), reply2.getHeaders().getCorrelationId());
}

View File

@@ -35,7 +35,7 @@ public class MessageHandlerChainTests {
chain.add(new TestHandler("b"));
chain.add(new TestHandler("c"));
chain.add(new TestHandler("d"));
Message<?> result = chain.handle(new StringMessage(1, "!"));
Message<?> result = chain.handle(new StringMessage("!"));
assertEquals("!abcd", result.getPayload());
}
@@ -49,7 +49,7 @@ public class MessageHandlerChainTests {
chain.add(new TestHandler("a"));
chain.add(handler4);
chain.add(new TestHandler("b"));
Message<?> result = chain.handle(new StringMessage(1, "!"));
Message<?> result = chain.handle(new StringMessage("!"));
assertEquals("234!a*234b", result.getPayload());
}
@@ -63,7 +63,7 @@ public class MessageHandlerChainTests {
}
public Message<?> handle(Message<?> message) {
return new StringMessage(1, message.getPayload() + text);
return new StringMessage(message.getPayload() + text);
}
}
@@ -78,8 +78,8 @@ public class MessageHandlerChainTests {
}
public Message<?> handle(Message<?> message, MessageHandler target) {
message = target.handle(new StringMessage(1, text + message.getPayload()));
return new StringMessage(1, message.getPayload() + text);
message = target.handle(new StringMessage(text + message.getPayload()));
return new StringMessage(message.getPayload() + text);
}
}

View File

@@ -87,7 +87,7 @@ public class MethodInvokingTargetTests {
target.setMethodName("foo");
target.afterPropertiesSet();
QueueChannel channel = new QueueChannel();
Message<String> message = new GenericMessage<String>("123", "testing");
Message<String> message = new GenericMessage<String>("testing");
channel.send(message);
assertNull(queue.poll());
MessageBus bus = new DefaultMessageBus();

View File

@@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.MessageBuilder;
/**
* @author Mark Fisher
@@ -39,8 +39,8 @@ public class ReplyMessageCorrelatorTests {
final ReplyMessageCorrelator correlator = new ReplyMessageCorrelator(10);
final AtomicInteger replyCounter = new AtomicInteger();
CountDownLatch latch = startReceivers(correlator, replyCounter, 5, 500);
Message<?> message = new StringMessage("test");
message.getHeader().setCorrelationId("123");
Message<String> message = MessageBuilder.fromPayload("test")
.setCorrelationId("123").build();
correlator.handle(message);
latch.await(1000, TimeUnit.MILLISECONDS);
assertEquals(0, latch.getCount());
@@ -50,8 +50,8 @@ public class ReplyMessageCorrelatorTests {
@Test
public void testReplyPrecedeReceivers() throws InterruptedException {
final ReplyMessageCorrelator correlator = new ReplyMessageCorrelator(10);
Message<?> message = new StringMessage("test");
message.getHeader().setCorrelationId("123");
Message<String> message = MessageBuilder.fromPayload("test")
.setCorrelationId("123").build();
correlator.handle(message);
final AtomicInteger replyCounter = new AtomicInteger();
CountDownLatch latch = startReceivers(correlator, replyCounter, 5, 50);

View File

@@ -30,6 +30,7 @@ import org.springframework.integration.annotation.Handler;
import org.springframework.integration.handler.DefaultMessageHandlerAdapter;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageHandlingException;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.message.StringMessage;
@@ -59,8 +60,8 @@ public class AnnotationMethodMessageMapperTests {
public void testRequiredAttributeProvided() throws Exception {
Method method = TestHandler.class.getMethod("requiredAttribute", Integer.class);
AnnotationMethodMessageMapper mapper = new AnnotationMethodMessageMapper(method);
Message<?> message = new StringMessage("foo");
message.getHeader().setAttribute("num", new Integer(123));
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("num", new Integer(123)).build();
Object[] args = (Object[]) mapper.mapMessage(message);
assertEquals(1, args.length);
assertEquals(new Integer(123), args[0]);
@@ -86,8 +87,8 @@ public class AnnotationMethodMessageMapperTests {
public void testRequiredPropertyProvided() throws Exception {
Method method = TestHandler.class.getMethod("requiredProperty", String.class);
AnnotationMethodMessageMapper mapper = new AnnotationMethodMessageMapper(method);
Message<?> message = new StringMessage("foo");
message.getHeader().setProperty("prop", "bar");
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("prop", "bar").build();
Object[] args = (Object[]) mapper.mapMessage(message);
assertEquals(1, args.length);
assertEquals("bar", args[0]);
@@ -97,9 +98,8 @@ public class AnnotationMethodMessageMapperTests {
public void testPropertiesMethodWithNonPropertiesPayload() throws Exception {
Method method = TestHandler.class.getMethod("propertiesMethod", Properties.class);
AnnotationMethodMessageMapper mapper = new AnnotationMethodMessageMapper(method);
Message<?> message = new StringMessage("test");
message.getHeader().setProperty("prop1", "foo");
message.getHeader().setProperty("prop2", "bar");
Message<String> message = MessageBuilder.fromPayload("test")
.setHeader("prop1", "foo").setHeader("prop2", "bar").build();
Object[] args = (Object[]) mapper.mapMessage(message);
Properties result = (Properties) args[0];
assertEquals(2, result.size());
@@ -114,9 +114,8 @@ public class AnnotationMethodMessageMapperTests {
Properties payload = new Properties();
payload.setProperty("prop1", "foo");
payload.setProperty("prop2", "bar");
Message<?> message = new GenericMessage<Properties>(payload);
message.getHeader().setProperty("prop1", "not");
message.getHeader().setProperty("prop2", "these");
Message<Properties> message = MessageBuilder.fromPayload(payload)
.setHeader("prop1", "not").setHeader("prop2", "these").build();
Object[] args = (Object[]) mapper.mapMessage(message);
Properties result = (Properties) args[0];
assertEquals(2, result.size());
@@ -129,12 +128,11 @@ public class AnnotationMethodMessageMapperTests {
public void testMapMethodWithNonMapPayload() throws Exception {
Method method = TestHandler.class.getMethod("mapMethod", Map.class);
AnnotationMethodMessageMapper mapper = new AnnotationMethodMessageMapper(method);
Message<?> message = new StringMessage("test");
message.getHeader().setAttribute("attrib1", new Integer(123));
message.getHeader().setAttribute("attrib2", new Integer(456));
Message<String> message = MessageBuilder.fromPayload("test")
.setHeader("attrib1", new Integer(123))
.setHeader("attrib2", new Integer(456)).build();
Object[] args = (Object[]) mapper.mapMessage(message);
Map<String, Integer> result = (HashMap<String, Integer>) args[0];
assertEquals(2, result.size());
Map<String, Object> result = (Map<String, Object>) args[0];
assertEquals(new Integer(123), result.get("attrib1"));
assertEquals(new Integer(456), result.get("attrib2"));
}
@@ -147,9 +145,9 @@ public class AnnotationMethodMessageMapperTests {
Map<String, Integer> payload = new HashMap<String, Integer>();
payload.put("attrib1", new Integer(123));
payload.put("attrib2", new Integer(456));
Message<?> message = new GenericMessage<Map>(payload);
message.getHeader().setAttribute("attrib1", "not");
message.getHeader().setProperty("attrib2", "these");
Message<Map<String, Integer>> message = MessageBuilder.fromPayload(payload)
.setHeader("attrib1", new Integer(123))
.setHeader("attrib2", new Integer(456)).build();
Object[] args = (Object[]) mapper.mapMessage(message);
Map<String, Integer> result = (Map<String, Integer>) args[0];
assertEquals(2, result.size());
@@ -218,8 +216,8 @@ public class AnnotationMethodMessageMapperTests {
adapter.setObject(handler);
adapter.setMethod(method);
adapter.setMessageMapper(mapper);
Message<?> message = new StringMessage("foo");
message.getHeader().setAttribute("number", 42);
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("number", 42).build();
Message<?> result = adapter.handle(message);
assertEquals("foo-42", result.getPayload());
}
@@ -233,9 +231,9 @@ public class AnnotationMethodMessageMapperTests {
adapter.setObject(handler);
adapter.setMethod(method);
adapter.setMessageMapper(mapper);
Message<?> message = new StringMessage("foo");
message.getHeader().setProperty("prop", "bar");
message.getHeader().setAttribute("number", 42);
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("prop", "bar")
.setHeader("number", 42).build();
Message<?> result = adapter.handle(message);
assertEquals("bar-42", result.getPayload());
}

View File

@@ -1,97 +0,0 @@
/*
* 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.message;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Set;
import org.junit.Test;
import org.springframework.integration.message.DefaultMessageHeader;
import org.springframework.integration.message.MessageHeader;
/**
* @author Mark Fisher
*/
public class DefaultMessageHeaderTests {
@Test
public void testTimestamp() {
MessageHeader header = new DefaultMessageHeader();
assertNotNull(header.getTimestamp());
}
@Test
public void testAttributes() {
MessageHeader header = new DefaultMessageHeader();
Integer value = new Integer(123);
Object previousValue = header.setAttribute("test", value);
assertNull(previousValue);
assertEquals(value, header.getAttribute("test"));
assertNull(header.getAttribute("nosuchattribute"));
Set<String> names = header.getAttributeNames();
assertEquals(1, names.size());
assertTrue(names.contains("test"));
Integer newValue = new Integer(456);
previousValue = header.setAttribute("test", newValue);
assertEquals(value, previousValue);
assertEquals(newValue, header.getAttribute("test"));
}
@Test
public void testProperties() {
MessageHeader header = new DefaultMessageHeader();
String previousValue = header.setProperty("foo", "bar");
assertNull(previousValue);
assertEquals("bar", header.getProperty("foo"));
assertNull(header.getProperty("nosuchproperty"));
Set<String> names = header.getPropertyNames();
assertEquals(1, names.size());
assertTrue(names.contains("foo"));
previousValue = header.setProperty("foo", "baz");
assertEquals("bar", previousValue);
assertEquals("baz", header.getProperty("foo"));
}
@Test
public void testSetAttributeIfAbsent() {
MessageHeader header = new DefaultMessageHeader();
Integer integer = new Integer(123);
assertNull(header.getAttribute("test"));
assertFalse(header.getAttributeNames().contains("test"));
Object existingValue = header.setAttributeIfAbsent("test", integer);
assertNull(existingValue);
assertEquals(integer, header.getAttribute("test"));
assertTrue(header.getAttributeNames().contains("test"));
}
@Test
public void testSetAttributeIfAbsentDoesNotOverride() {
MessageHeader header = new DefaultMessageHeader();
Integer originalValue = new Integer(123);
header.setAttributeIfAbsent("test", originalValue);
Object existingValue = header.setAttributeIfAbsent("test", new Integer(456));
assertEquals(originalValue, header.getAttribute("test"));
assertEquals(originalValue, existingValue);
}
}

View File

@@ -17,11 +17,9 @@
package org.springframework.integration.message;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
@@ -30,44 +28,18 @@ import org.junit.Test;
*/
public class GenericMessageTests {
private static final long ONE_MINUTE = 60 * 1000;
@Test
public void testExpiredMessage() {
GenericMessage<Integer> expiredMessage = new GenericMessage<Integer>(1);
Date past = new Date(System.currentTimeMillis() - ONE_MINUTE);
expiredMessage.getHeader().setExpiration(past);
assertTrue(expiredMessage.isExpired());
}
@Test
public void testUnexpiredMessage() {
GenericMessage<Integer> unexpiredMessage = new GenericMessage<Integer>(1);
Date future = new Date(System.currentTimeMillis() + ONE_MINUTE);
unexpiredMessage.getHeader().setExpiration(future);
assertFalse(unexpiredMessage.isExpired());
}
@Test
public void testMessageWithNullExpirationNeverExpires() {
GenericMessage<Integer> message = new GenericMessage<Integer>(1);
assertNull(message.getHeader().getExpiration());
assertFalse(message.isExpired());
}
@Test
public void testMessageHeaderCopied() {
MessageHeader header = new DefaultMessageHeader();
header.setAttribute("testAttribute", new Integer(123));
header.setProperty("testProperty", "foo");
header.setSequenceSize(42);
header.setSequenceNumber(24);
GenericMessage<String> message = new GenericMessage<String>("test", header);
assertEquals(new Integer(123), message.getHeader().getAttribute("testAttribute"));
assertEquals("foo", message.getHeader().getProperty("testProperty"));
assertEquals(42, message.getHeader().getSequenceSize());
assertEquals(24, message.getHeader().getSequenceNumber());
public void testMessageHeadersCopiedFromMap() {
Map<String, Object> headerMap = new HashMap<String, Object>();
headerMap.put("testAttribute", new Integer(123));
headerMap.put("testProperty", "foo");
headerMap.put(MessageHeaders.SEQUENCE_SIZE, 42);
headerMap.put(MessageHeaders.SEQUENCE_NUMBER, 24);
GenericMessage<String> message = new GenericMessage<String>("test", headerMap);
assertEquals(new Integer(123), message.getHeaders().get("testAttribute"));
assertEquals("foo", message.getHeaders().get("testProperty", String.class));
assertEquals(new Integer(42), message.getHeaders().getSequenceSize());
assertEquals(new Integer(24), message.getHeaders().getSequenceNumber());
}
}

View File

@@ -0,0 +1,73 @@
/*
* 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.message;
import static org.junit.Assert.assertEquals;
import java.util.Date;
import org.junit.Test;
/**
* @author Mark Fisher
*/
public class MessageBuilderTests {
@Test
public void testSimpleMessageCreation() {
Message<String> message = MessageBuilder.fromPayload("foo").build();
assertEquals("foo", message.getPayload());
}
@Test
public void testHeaderValues() {
Message<String> message = MessageBuilder.fromPayload("test")
.setHeader("foo", "bar")
.setHeader("count", new Integer(123))
.build();
assertEquals("bar", message.getHeaders().get("foo", String.class));
assertEquals(new Integer(123), message.getHeaders().get("count", Integer.class));
}
@Test
public void testCopiedHeaderValues() {
Message<String> message1 = MessageBuilder.fromPayload("test1")
.setHeader("foo", "1")
.setHeader("bar", "2")
.build();
Message<String> message2 = MessageBuilder.fromPayload("test2")
.copyHeadersFromMessage(message1)
.setHeader("foo", "42")
.setHeaderIfAbsent("bar", "99")
.build();
assertEquals("test1", message1.getPayload());
assertEquals("test2", message2.getPayload());
assertEquals("1", message1.getHeaders().get("foo"));
assertEquals("42", message2.getHeaders().get("foo"));
assertEquals("2", message1.getHeaders().get("bar"));
assertEquals("2", message2.getHeaders().get("bar"));
}
@Test
public void testExpirationDate() {
Date past = new Date(System.currentTimeMillis() - (60 * 1000));
Message<Integer> expiredMessage = MessageBuilder.fromPayload(1)
.setExpirationDate(past).build();
assertEquals(past, expiredMessage.getHeaders().getExpirationDate());
}
}

View File

@@ -0,0 +1,93 @@
/*
* 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.message;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
/**
* @author Mark Fisher
*/
public class MessageHeadersTests {
@Test
public void testTimestamp() {
MessageHeaders headers = new MessageHeaders(null);
assertNotNull(headers.getTimestamp());
}
@Test
public void testNonTypedAccessOfHeaderValue() {
Integer value = new Integer(123);
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", value);
MessageHeaders headers = new MessageHeaders(map);
assertEquals(value, headers.get("test"));
}
@Test
public void testTypedAccessOfHeaderValue() {
Integer value = new Integer(123);
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", value);
MessageHeaders headers = new MessageHeaders(map);
assertEquals(value, headers.get("test", Integer.class));
}
@Test(expected = MessagingException.class)
public void testTypeMismatchWhenAccessingHeaderValue() {
Integer value = new Integer(123);
Map<String, Object> map = new HashMap<String, Object>();
map.put("test", value);
MessageHeaders headers = new MessageHeaders(map);
assertEquals(value, headers.get("test", String.class));
}
@Test
public void testNullHeaderValue() {
Map<String, Object> map = new HashMap<String, Object>();
MessageHeaders headers = new MessageHeaders(map);
assertNull(headers.get("nosuchattribute"));
}
@Test
public void testNullHeaderValueWithTypedAccess() {
Map<String, Object> map = new HashMap<String, Object>();
MessageHeaders headers = new MessageHeaders(map);
assertNull(headers.get("nosuchattribute", String.class));
}
@Test
public void testHeaderKeys() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key1", "val1");
map.put("key2", new Integer(123));
MessageHeaders headers = new MessageHeaders(map);
Set<String> keys = headers.keySet();
assertTrue(keys.contains("key1"));
assertTrue(keys.contains("key2"));
}
}

View File

@@ -24,7 +24,7 @@ import java.util.Date;
import org.junit.Test;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.MessageBuilder;
/**
* @author Mark Fisher
@@ -34,8 +34,8 @@ public class UnexpiredMessageSelectorTests {
@Test
public void testExpiredMessageRejected() {
long past = System.currentTimeMillis() - 60000;
Message<?> message = new StringMessage("expired");
message.getHeader().setExpiration(new Date(past));
Message<String> message = MessageBuilder.fromPayload("expired")
.setExpirationDate(new Date(past)).build();
UnexpiredMessageSelector selector = new UnexpiredMessageSelector();
assertFalse(selector.accept(message));
}
@@ -43,8 +43,15 @@ public class UnexpiredMessageSelectorTests {
@Test
public void testUnexpiredMessageAccepted() {
long future = System.currentTimeMillis() + 60000;
Message<?> message = new StringMessage("unexpired");
message.getHeader().setExpiration(new Date(future));
Message<String> message = MessageBuilder.fromPayload("unexpired")
.setExpirationDate(new Date(future)).build();
UnexpiredMessageSelector selector = new UnexpiredMessageSelector();
assertTrue(selector.accept(message));
}
@Test
public void testMessageWithNullExpirationDateNeverExpires() {
Message<String> message = MessageBuilder.fromPayload("unexpired").build();
UnexpiredMessageSelector selector = new UnexpiredMessageSelector();
assertTrue(selector.accept(message));
}

View File

@@ -31,6 +31,7 @@ import org.junit.Test;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageHandlingException;
import org.springframework.integration.message.StringMessage;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -215,11 +216,12 @@ public class AggregatingMessageHandlerTests {
private static Message<?> createMessage(String payload, Object correlationId,
int sequenceSize, int sequenceNumber, MessageChannel replyChannel) {
StringMessage message = new StringMessage(payload);
message.getHeader().setCorrelationId(correlationId);
message.getHeader().setSequenceSize(sequenceSize);
message.getHeader().setSequenceNumber(sequenceNumber);
message.getHeader().setReturnAddress(replyChannel);
Message<String> message = MessageBuilder.fromPayload(payload)
.setCorrelationId(correlationId)
.setSequenceSize(sequenceSize)
.setSequenceNumber(sequenceNumber)
.setReturnAddress(replyChannel)
.build();
return message;
}
@@ -263,7 +265,7 @@ public class AggregatingMessageHandlerTests {
try {
Message<?> result = this.aggregator.handle(message);
if (result != null) {
Object returnAddress = message.getHeader().getReturnAddress();
Object returnAddress = message.getHeaders().getReturnAddress();
if (returnAddress instanceof MessageChannel) {
((MessageChannel) returnAddress).send(result);
}

View File

@@ -194,20 +194,20 @@ public class CompletionStrategyAdapterTests {
private static class SimpleCompletionStrategy {
public boolean checkCompletenessOnNonParameterizedListOfMessages(List<Message> messages) {
public boolean checkCompletenessOnNonParameterizedListOfMessages(List<Message<?>> messages) {
Assert.assertTrue(messages.size() > 0);
return messages.size() > messages.iterator().next().getHeader().getSequenceSize();
return messages.size() > messages.iterator().next().getHeaders().getSequenceSize();
}
public boolean checkCompletenessOnListOfMessagesParametrizedWithWildcard(List<Message<?>> messages) {
Assert.assertTrue(messages.size() > 0);
return messages.size() > messages.iterator().next().getHeader().getSequenceSize();
return messages.size() > messages.iterator().next().getHeaders().getSequenceSize();
}
public boolean checkCompletenessOnListOfMessagesParametrizedWithString(
List<Message<String>> messages) {
Assert.assertTrue(messages.size() > 0);
return messages.size() > messages.iterator().next().getHeader().getSequenceSize();
return messages.size() > messages.iterator().next().getHeaders().getSequenceSize();
}
// Example for the case when completeness is checked on the structure of

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2007 the original author or authors.
* 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.
@@ -20,6 +20,8 @@ import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
/**
@@ -30,30 +32,30 @@ public class MessageSequenceComparatorTests {
@Test
public void testLessThan() {
MessageSequenceComparator comparator = new MessageSequenceComparator();
StringMessage message1 = new StringMessage("test1");
message1.getHeader().setSequenceNumber(1);
StringMessage message2 = new StringMessage("test2");
message2.getHeader().setSequenceNumber(2);
Message<String> message1 = MessageBuilder.fromPayload("test1")
.setSequenceNumber(1).build();
Message<String> message2 = MessageBuilder.fromPayload("test2")
.setSequenceNumber(2).build();
assertEquals(-1, comparator.compare(message1, message2));
}
@Test
public void testEqual() {
MessageSequenceComparator comparator = new MessageSequenceComparator();
StringMessage message1 = new StringMessage("test1");
message1.getHeader().setSequenceNumber(3);
StringMessage message2 = new StringMessage("test2");
message2.getHeader().setSequenceNumber(3);
Message<String> message1 = MessageBuilder.fromPayload("test1")
.setSequenceNumber(3).build();
Message<String> message2 = MessageBuilder.fromPayload("test2")
.setSequenceNumber(3).build();
assertEquals(0, comparator.compare(message1, message2));
}
@Test
public void testGreaterThan() {
MessageSequenceComparator comparator = new MessageSequenceComparator();
StringMessage message1 = new StringMessage("test1");
message1.getHeader().setSequenceNumber(5);
StringMessage message2 = new StringMessage("test2");
message2.getHeader().setSequenceNumber(3);
Message<String> message1 = MessageBuilder.fromPayload("test1")
.setSequenceNumber(5).build();
Message<String> message2 = MessageBuilder.fromPayload("test2")
.setSequenceNumber(3).build();
assertEquals(1, comparator.compare(message1, message2));
}

View File

@@ -53,7 +53,7 @@ public class MultiChannelRouterTests {
MultiChannelRouter router = new MultiChannelRouter();
router.setChannelResolver(channelResolver);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result1 = channel1.receive(25);
assertNotNull(result1);
@@ -79,7 +79,7 @@ public class MultiChannelRouterTests {
router.setChannelNameResolver(channelNameResolver);
router.setChannelRegistry(channelRegistry);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result1 = channel1.receive(25);
assertNotNull(result1);
@@ -117,7 +117,7 @@ public class MultiChannelRouterTests {
MultiChannelRouter router = new MultiChannelRouter();
router.setChannelResolver(channelResolver);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}
@@ -132,7 +132,7 @@ public class MultiChannelRouterTests {
router.setChannelResolver(channelResolver);
router.setResolutionRequired(true);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}
@@ -148,7 +148,7 @@ public class MultiChannelRouterTests {
router.setChannelNameResolver(channelNameResolver);
router.setChannelRegistry(channelRegistry);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}
@@ -165,7 +165,7 @@ public class MultiChannelRouterTests {
router.setChannelRegistry(channelRegistry);
router.setResolutionRequired(true);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}

View File

@@ -48,7 +48,7 @@ public class RecipientListRouterTests {
RecipientListRouter router = new RecipientListRouter();
router.setChannels(channels);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result1 = channel1.receive(25);
assertNotNull(result1);
@@ -69,7 +69,7 @@ public class RecipientListRouterTests {
router.setChannelNames(new String[] {"channel1", "channel2"});
router.setChannelRegistry(channelRegistry);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result1 = channel1.receive(25);
assertNotNull(result1);
@@ -90,7 +90,7 @@ public class RecipientListRouterTests {
router.setChannelNames(new String[] {"channel1"});
router.setChannelRegistry(channelRegistry);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result1 = channel1.receive(25);
assertNotNull(result1);

View File

@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.router;
import java.util.concurrent.CountDownLatch;
@@ -27,7 +28,7 @@ import org.junit.Test;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.MessageBuilder;
/**
* @author Marius Bogoevici
@@ -51,11 +52,11 @@ public class ResequencerMessageHandlerTests {
Message<?> reply2 = replyChannel.receive(500);
Message<?> reply3 = replyChannel.receive(500);
assertNotNull(reply1);
assertEquals(1, reply1.getHeader().getSequenceNumber());
assertEquals(new Integer(1), reply1.getHeaders().getSequenceNumber());
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceNumber());
assertNotNull(reply3);
assertEquals(3, reply3.getHeader().getSequenceNumber());
assertEquals(new Integer(3), reply3.getHeaders().getSequenceNumber());
}
@Test
@@ -77,9 +78,9 @@ public class ResequencerMessageHandlerTests {
Message<?> reply3 = replyChannel.receive(500);
// only messages 1 and 2 must have been received by now
assertNotNull(reply1);
assertEquals(1, reply1.getHeader().getSequenceNumber());
assertEquals(new Integer(1), reply1.getHeaders().getSequenceNumber());
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceNumber());
assertNull(reply3);
// when sending the last message, the whole sequence must have been sent
latch = new CountDownLatch(1);
@@ -88,9 +89,9 @@ public class ResequencerMessageHandlerTests {
reply3 = replyChannel.receive(500);
Message<?> reply4 = replyChannel.receive(500);
assertNotNull(reply3);
assertEquals(3, reply3.getHeader().getSequenceNumber());
assertEquals(new Integer(3), reply3.getHeaders().getSequenceNumber());
assertNotNull(reply4);
assertEquals(4, reply4.getHeader().getSequenceNumber());
assertEquals(new Integer(4), reply4.getHeaders().getSequenceNumber());
}
@@ -124,23 +125,25 @@ public class ResequencerMessageHandlerTests {
reply3 = replyChannel.receive(500);
Message<?> reply4 = replyChannel.receive(500);
assertNotNull(reply1);
assertEquals(1, reply1.getHeader().getSequenceNumber());
assertEquals(new Integer(1), reply1.getHeaders().getSequenceNumber());
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceNumber());
assertNotNull(reply3);
assertEquals(3, reply3.getHeader().getSequenceNumber());
assertEquals(new Integer(3), reply3.getHeaders().getSequenceNumber());
assertNotNull(reply4);
assertEquals(4, reply4.getHeader().getSequenceNumber());
assertEquals(new Integer(4), reply4.getHeaders().getSequenceNumber());
}
private static Message<?> createMessage(String payload, Object correlationId,
int sequenceSize, int sequenceNumber, MessageChannel replyChannel) {
StringMessage message = new StringMessage(payload);
message.getHeader().setCorrelationId(correlationId);
message.getHeader().setSequenceSize(sequenceSize);
message.getHeader().setSequenceNumber(sequenceNumber);
message.getHeader().setReturnAddress(replyChannel);
Message<String> message = MessageBuilder.fromPayload(payload)
.setCorrelationId(correlationId)
.setSequenceSize(sequenceSize)
.setSequenceNumber(sequenceNumber)
.setReturnAddress(replyChannel)
.build();
return message;
}
}

View File

@@ -36,6 +36,7 @@ import org.springframework.integration.handler.annotation.HeaderAttribute;
import org.springframework.integration.handler.annotation.HeaderProperty;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.StringMessage;
/**
@@ -59,7 +60,7 @@ public class RouterMessageHandlerAdapterTests {
}
private void doTestChannelNameResolutionByPayload(RouterMessageHandlerAdapter adapter) {
Message<String> message = new GenericMessage<String>("123", "bar");
Message<String> message = new GenericMessage<String>("bar");
QueueChannel barChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("bar-channel", barChannel);
@@ -72,12 +73,12 @@ public class RouterMessageHandlerAdapterTests {
}
@Test
public void testChannelNameResolutionByProperty() throws Exception {
public void testChannelNameResolutionByHeader() throws Exception {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeByProperty", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
Message<String> message = new GenericMessage<String>("123", "bar");
message.getHeader().setProperty("returnAddress", "baz");
Message<String> message = MessageBuilder.fromPayload("bar")
.setHeader("returnAddress", "baz").build();
QueueChannel barChannel = new QueueChannel();
QueueChannel bazChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
@@ -93,40 +94,13 @@ public class RouterMessageHandlerAdapterTests {
assertEquals("bar", message2.getPayload());
}
@Test
public void testChannelNameResolutionByAttribute() throws Exception {
SingleChannelNameRoutingTestBean testBean = new SingleChannelNameRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("routeByAttribute", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
Message<String> message = new GenericMessage<String>("123", "bar");
message.getHeader().setProperty("returnAddress", "bad");
message.getHeader().setAttribute("returnAddress", "baz");
QueueChannel barChannel = new QueueChannel();
QueueChannel badChannel = new QueueChannel();
QueueChannel bazChannel = new QueueChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("bar-channel", barChannel);
channelRegistry.registerChannel("bad-channel", badChannel);
channelRegistry.registerChannel("baz-channel", bazChannel);
adapter.setChannelRegistry(channelRegistry);
adapter.afterPropertiesSet();
adapter.handle(message);
Message<?> message1 = barChannel.receive(0);
assertNull(message1);
Message<?> message2 = badChannel.receive(0);
assertNull(message2);
Message<?> message3 = bazChannel.receive(0);
assertNotNull(message3);
assertEquals("bar", message3.getPayload());
}
@Test(expected=ConfigurationException.class)
public void testFailsWhenPropertyAndAttributeAreBothProvided() throws Exception {
InvalidRoutingTestBean testBean = new InvalidRoutingTestBean();
Method routingMethod = testBean.getClass().getMethod("tooManyAnnotations", String.class);
RouterMessageHandlerAdapter adapter = new RouterMessageHandlerAdapter(testBean, routingMethod);
adapter.afterPropertiesSet();
adapter.handle(new GenericMessage<String>("123", "testing"));
adapter.handle(new GenericMessage<String>("testing"));
}
@Test

View File

@@ -25,7 +25,7 @@ import java.util.List;
import org.junit.Test;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.message.MessageBuilder;
/**
* @author Mark Fisher
@@ -34,8 +34,8 @@ public class SequenceSizeCompletionStrategyTests {
@Test
public void testIncompleteList() {
Message<?> message = new StringMessage("test1");
message.getHeader().setSequenceSize(2);
Message<String> message = MessageBuilder.fromPayload("test1")
.setSequenceSize(2).build();
List<Message<?>> messages = new ArrayList<Message<?>>();
messages.add(message);
SequenceSizeCompletionStrategy completionStrategy = new SequenceSizeCompletionStrategy();
@@ -44,10 +44,10 @@ public class SequenceSizeCompletionStrategyTests {
@Test
public void testCompleteList() {
Message<?> message1 = new StringMessage("test1");
message1.getHeader().setSequenceSize(2);
Message<?> message2 = new StringMessage("test2");
message2.getHeader().setSequenceSize(2);
Message<String> message1 = MessageBuilder.fromPayload("test1")
.setSequenceSize(2).build();
Message<String> message2 = MessageBuilder.fromPayload("test2")
.setSequenceSize(2).build();
List<Message<?>> messages = new ArrayList<Message<?>>();
messages.add(message1);
messages.add(message2);

View File

@@ -46,7 +46,7 @@ public class SingleChannelRouterTests {
SingleChannelRouter router = new SingleChannelRouter();
router.setChannelResolver(channelResolver);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result = channel.receive(25);
assertNotNull(result);
@@ -67,7 +67,7 @@ public class SingleChannelRouterTests {
router.setChannelNameResolver(channelNameResolver);
router.setChannelRegistry(channelRegistry);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
Message<?> result = channel.receive(25);
assertNotNull(result);
@@ -102,7 +102,7 @@ public class SingleChannelRouterTests {
SingleChannelRouter router = new SingleChannelRouter();
router.setChannelResolver(channelResolver);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}
@@ -117,7 +117,7 @@ public class SingleChannelRouterTests {
router.setChannelResolver(channelResolver);
router.setResolutionRequired(true);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}
@@ -133,7 +133,7 @@ public class SingleChannelRouterTests {
router.setChannelNameResolver(channelNameResolver);
router.setChannelRegistry(channelRegistry);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}
@@ -150,7 +150,7 @@ public class SingleChannelRouterTests {
router.setChannelRegistry(channelRegistry);
router.setResolutionRequired(true);
router.afterPropertiesSet();
Message<String> message = new StringMessage("123", "test");
Message<String> message = new StringMessage("test");
router.handle(message);
}

View File

@@ -223,14 +223,14 @@ public class SplitterMessageHandlerAdapterTests {
adapter.handle(message);
Message<?> reply1 = testChannel.receive(0);
assertNotNull(reply1);
assertEquals(2, reply1.getHeader().getSequenceSize());
assertEquals(1, reply1.getHeader().getSequenceNumber());
assertEquals(message.getId(), reply1.getHeader().getCorrelationId());
assertEquals(new Integer(2), reply1.getHeaders().getSequenceSize());
assertEquals(new Integer(1), reply1.getHeaders().getSequenceNumber());
assertEquals(message.getId(), reply1.getHeaders().getCorrelationId());
Message<?> reply2 = testChannel.receive(0);
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceSize());
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(message.getId(), reply2.getHeader().getCorrelationId());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceSize());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceNumber());
assertEquals(message.getId(), reply2.getHeaders().getCorrelationId());
}
@Test
@@ -240,14 +240,14 @@ public class SplitterMessageHandlerAdapterTests {
adapter.handle(message);
Message<?> reply1 = testChannel.receive(0);
assertNotNull(reply1);
assertEquals(2, reply1.getHeader().getSequenceSize());
assertEquals(1, reply1.getHeader().getSequenceNumber());
assertEquals(message.getId(), reply1.getHeader().getCorrelationId());
assertEquals(new Integer(2), reply1.getHeaders().getSequenceSize());
assertEquals(new Integer(1), reply1.getHeaders().getSequenceNumber());
assertEquals(message.getId(), reply1.getHeaders().getCorrelationId());
Message<?> reply2 = testChannel.receive(0);
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceSize());
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(message.getId(), reply2.getHeader().getCorrelationId());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceSize());
assertEquals(new Integer(2), reply2.getHeaders().getSequenceNumber());
assertEquals(message.getId(), reply2.getHeaders().getCorrelationId());
}

View File

@@ -29,6 +29,7 @@ import org.springframework.integration.handler.annotation.HeaderAttribute;
import org.springframework.integration.handler.annotation.HeaderProperty;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageHandlingException;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.message.StringMessage;
@@ -76,65 +77,54 @@ public class AnnotationMethodTransformerAdapterTests {
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("attributeTest", String.class, Integer.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setAttribute("number", 123);
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("number", 123).build();
Message<?> result = adapter.handle(message);
assertEquals("foo123", result.getPayload());
}
@Test(expected=MessageHandlingException.class)
public void testHeaderAttributeNotProvided() throws Exception {
public void testHeaderValueNotProvided() throws Exception {
TestBean testBean = new TestBean();
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("attributeTest", String.class, Integer.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setAttribute("wrong", 123);
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("wrong", 123).build();
adapter.handle(message);
}
@Test
public void testHeaderPropertyAnnotation() throws Exception {
public void testHeaderAnnotation() throws Exception {
TestBean testBean = new TestBean();
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("propertyTest", String.class, String.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setProperty("suffix", "bar");
Message<String> message = MessageBuilder.fromPayload("foo")
.setHeader("suffix", "bar").build();
Message<?> result = adapter.handle(message);
assertEquals("foobar", result.getPayload());
}
@Test(expected=MessageHandlingException.class)
public void testHeaderPropertyNotAvailable() throws Exception {
TestBean testBean = new TestBean();
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("propertyTest", String.class, String.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setProperty("wrong", "bar");
adapter.handle(message);
}
@Test
public void testPropertyEnricher() throws Exception {
public void testHeaderEnricher() throws Exception {
TestBean testBean = new TestBean();
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("propertyEnricherTest", String.class));
Message<?> message = new StringMessage("test");
message.getHeader().setProperty("prop1", "bad");
message.getHeader().setProperty("prop3", "baz");
Message<String> message = MessageBuilder.fromPayload("test")
.setHeader("prop1", "bad")
.setHeader("prop3", "baz").build();
Message<?> result = adapter.handle(message);
assertEquals("test", result.getPayload());
assertEquals("foo", result.getHeader().getProperty("prop1"));
assertEquals("bar", result.getHeader().getProperty("prop2"));
assertEquals("baz", result.getHeader().getProperty("prop3"));
assertEquals("foo", result.getHeaders().get("prop1"));
assertEquals("bar", result.getHeaders().get("prop2"));
assertEquals("baz", result.getHeaders().get("prop3"));
}
@Test
@SuppressWarnings("unchecked")
public void testPropertyPayload() throws Exception {
public void testPropertiesPayload() throws Exception {
TestBean testBean = new TestBean();
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
adapter.setObject(testBean);
@@ -149,9 +139,9 @@ public class AnnotationMethodTransformerAdapterTests {
assertEquals("foo", payload.getProperty("prop1"));
assertEquals("bar", payload.getProperty("prop2"));
assertEquals("baz", payload.getProperty("prop3"));
assertNull(result.getHeader().getProperty("prop1"));
assertNull(result.getHeader().getProperty("prop2"));
assertNull(result.getHeader().getProperty("prop3"));
assertNull(result.getHeaders().get("prop1"));
assertNull(result.getHeaders().get("prop2"));
assertNull(result.getHeaders().get("prop3"));
}