Using the header-copying constructor when creating Messages from Object-typed return values.

This commit is contained in:
Mark Fisher
2008-02-26 01:04:43 +00:00
parent 8b7cd7c0ff
commit abedfb0b3d
2 changed files with 43 additions and 5 deletions

View File

@@ -28,6 +28,7 @@ import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.handler.AbstractMessageHandlerAdapter;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessageHeader;
import org.springframework.integration.util.SimpleMethodInvoker;
import org.springframework.util.Assert;
@@ -72,6 +73,7 @@ public class SplitterMessageHandlerAdapter<T> extends AbstractMessageHandlerAdap
@Override
protected final Object doHandle(Message<?> message, SimpleMethodInvoker<T> invoker) {
final MessageHeader originalMessageHeader = message.getHeader();
if (method.getParameterTypes().length != 1) {
throw new MessagingConfigurationException(
"Splitter method must accept exactly one parameter");
@@ -102,7 +104,9 @@ public class SplitterMessageHandlerAdapter<T> extends AbstractMessageHandlerAdap
int sequenceNumber = 0;
int sequenceSize = items.size();
for (Object item : items) {
Message<?> splitMessage = prepareMessage(item, message.getId(), ++sequenceNumber, sequenceSize);
Message<?> splitMessage = (item instanceof Message<?>) ? (Message<?>) item :
this.createReplyMessage(item, originalMessageHeader);
this.prepareMessage(splitMessage, message.getId(), ++sequenceNumber, sequenceSize);
this.sendMessage(splitMessage, channelName);
}
}
@@ -111,7 +115,9 @@ public class SplitterMessageHandlerAdapter<T> extends AbstractMessageHandlerAdap
int sequenceNumber = 0;
int sequenceSize = array.length;
for (Object item : array) {
Message<?> splitMessage = prepareMessage(item, message.getId(), ++sequenceNumber, sequenceSize);
Message<?> splitMessage = (item instanceof Message<?>) ? (Message<?>) item :
this.createReplyMessage(item, originalMessageHeader);
this.prepareMessage(splitMessage, message.getId(), ++sequenceNumber, sequenceSize);
this.sendMessage(splitMessage, channelName);
}
}
@@ -122,12 +128,10 @@ public class SplitterMessageHandlerAdapter<T> extends AbstractMessageHandlerAdap
return null;
}
private Message<?> prepareMessage(Object item, Object correlationId, int sequenceNumber, int sequenceSize) {
Message<?> message = (item instanceof Message) ? (Message<?>) item : new GenericMessage(item);
private void prepareMessage(Message<?> message, Object correlationId, int sequenceNumber, int sequenceSize) {
message.getHeader().setCorrelationId(correlationId);
message.getHeader().setSequenceNumber(sequenceNumber);
message.getHeader().setSequenceSize(sequenceSize);
return message;
}
private boolean sendMessage(Message<?> message, String channelName) {

View File

@@ -169,6 +169,40 @@ public class SplitterMessageHandlerAdapterTests {
adapter.handle(message);
}
@Test
public void testHeaderForObjectReturnValues() throws Exception {
StringMessage message = new StringMessage("foo.bar");
SplitterMessageHandlerAdapter adapter = this.getAdapter("stringToStringArray");
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());
Message<?> reply2 = testChannel.receive(0);
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceSize());
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(message.getId(), reply2.getHeader().getCorrelationId());
}
@Test
public void testHeaderForMessageReturnValues() throws Exception {
StringMessage message = new StringMessage("foo.bar");
SplitterMessageHandlerAdapter adapter = this.getAdapter("messageToMessageList");
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());
Message<?> reply2 = testChannel.receive(0);
assertNotNull(reply2);
assertEquals(2, reply2.getHeader().getSequenceSize());
assertEquals(2, reply2.getHeader().getSequenceNumber());
assertEquals(message.getId(), reply2.getHeader().getCorrelationId());
}
private SplitterMessageHandlerAdapter getAdapter(String methodName) throws Exception {
Class<?> paramType = methodName.startsWith("message") ? Message.class : String.class;