Message payload can no longer be set. MessageTransformer's transform() method now returns a Message (instead of void). ChannelInterceptor preSend() and postReceive() methods now return a Message instead of boolean.

This commit is contained in:
Mark Fisher
2008-07-15 22:43:47 +00:00
parent 0056edd10d
commit d344504e38
37 changed files with 303 additions and 273 deletions

View File

@@ -54,7 +54,7 @@ public class DefaultErrorChannel extends RendezvousChannel {
* Even if the error channel has no subscribers, errors are at least visible at debug level.
*/
@Override
public boolean preSend(Message<?> message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
if (logger.isDebugEnabled()) {
String errorMessage = "Error Received. Message: " + message.toString();
Object payload = message.getPayload();
@@ -65,7 +65,7 @@ public class DefaultErrorChannel extends RendezvousChannel {
logger.debug(errorMessage);
}
}
return true;
return message;
}
}

View File

@@ -110,7 +110,8 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
* time or the sending thread is interrupted.
*/
public final boolean send(Message<?> message, long timeout) {
if (!this.interceptors.preSend(message, this)) {
message = this.interceptors.preSend(message, this);
if (message == null) {
return false;
}
boolean sent = this.doSend(message, timeout);
@@ -147,7 +148,7 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
return null;
}
Message<?> message = this.doReceive(timeout);
this.interceptors.postReceive(message, this);
message = this.interceptors.postReceive(message, this);
return message;
}
@@ -194,16 +195,17 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
return this.interceptors.add(interceptor);
}
public boolean preSend(Message<?> message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
if (logger.isDebugEnabled()) {
logger.debug("preSend on channel '" + channel + "', message: " + message);
}
for (ChannelInterceptor interceptor : interceptors) {
if (!interceptor.preSend(message, channel)) {
return false;
message = interceptor.preSend(message, channel);
if (message == null) {
return null;
}
}
return true;
return message;
}
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
@@ -227,7 +229,7 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
return true;
}
public void postReceive(Message<?> message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
if (message != null && logger.isDebugEnabled()) {
logger.debug("postReceive on channel '" + channel + "', message: " + message);
}
@@ -235,8 +237,12 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanName
logger.trace("postReceive on channel '" + channel + "', message is null");
}
for (ChannelInterceptor interceptor : interceptors) {
interceptor.postReceive(message, channel);
message = interceptor.postReceive(message, channel);
if (message == null) {
return null;
}
}
return message;
}
}

View File

@@ -27,12 +27,12 @@ import org.springframework.integration.message.Message;
*/
public interface ChannelInterceptor {
boolean preSend(Message<?> message, MessageChannel channel);
Message<?> preSend(Message<?> message, MessageChannel channel);
void postSend(Message<?> message, MessageChannel channel, boolean sent);
boolean preReceive(MessageChannel channel);
void postReceive(Message<?> message, MessageChannel channel);
Message<?> postReceive(Message<?> message, MessageChannel channel);
}

View File

@@ -28,8 +28,8 @@ import org.springframework.integration.message.Message;
*/
public class ChannelInterceptorAdapter implements ChannelInterceptor {
public boolean preSend(Message<?> message, MessageChannel channel) {
return true;
public Message<?> preSend(Message<?> message, MessageChannel channel) {
return message;
}
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
@@ -39,7 +39,8 @@ public class ChannelInterceptorAdapter implements ChannelInterceptor {
return true;
}
public void postReceive(Message<?> message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
return message;
}
}

View File

@@ -42,14 +42,14 @@ public class MessageSelectingInterceptor extends ChannelInterceptorAdapter {
@Override
public boolean preSend(Message<?> message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
for (MessageSelector selector : this.selectors) {
if (!selector.accept(message)) {
throw new MessageDeliveryException(message,
"selector '" + selector + "' did not accept message");
}
}
return true;
return message;
}
}

View File

@@ -54,11 +54,11 @@ public class MessageStoringInterceptor extends ChannelInterceptorAdapter {
@Override
public boolean preSend(Message<?> message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
if (message != null) {
this.messageStore.put(message.getId(), message);
}
return true;
return message;
}
@Override
@@ -84,10 +84,11 @@ public class MessageStoringInterceptor extends ChannelInterceptorAdapter {
}
@Override
public void postReceive(Message<?> message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
if (message != null) {
this.messageStore.remove(message.getId());
}
return message;
}
}

View File

@@ -98,7 +98,7 @@ public class WireTap extends ChannelInterceptorAdapter implements Lifecycle {
}
@Override
public boolean preSend(Message<?> message, MessageChannel channel) {
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());
@@ -109,7 +109,7 @@ public class WireTap extends ChannelInterceptorAdapter implements Lifecycle {
}
}
}
return true;
return message;
}
/**

View File

@@ -31,8 +31,6 @@ public interface Message<T> extends Serializable {
T getPayload();
void setPayload(T payload);
boolean isExpired();
void copyHeader(MessageHeader header, boolean overwriteExistingValues);

View File

@@ -22,6 +22,7 @@ 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.MessageMapper;
import org.springframework.integration.message.MessagingException;
@@ -30,8 +31,7 @@ import org.springframework.integration.util.AbstractMethodInvokingAdapter;
/**
* @author Mark Fisher
*/
public class AnnotationMethodTransformerAdapter extends AbstractMethodInvokingAdapter
implements MessageTransformer, MessageHandler {
public class AnnotationMethodTransformerAdapter extends AbstractMethodInvokingAdapter implements MessageHandler {
private volatile MessageMapper mapper;
@@ -49,12 +49,12 @@ public class AnnotationMethodTransformerAdapter extends AbstractMethodInvokingAd
}
@SuppressWarnings("unchecked")
public void transform(Message message) {
public Message<?> transform(Message<?> message) {
if (!this.isInitialized()) {
this.afterPropertiesSet();
}
if (message.getPayload() == null) {
return;
return message;
}
Object param = (this.methodExpectsMessage) ? message : this.mapper.mapMessage(message);
try {
@@ -78,7 +78,7 @@ public class AnnotationMethodTransformerAdapter extends AbstractMethodInvokingAd
if (logger.isDebugEnabled()) {
logger.debug("MessageTransformer returned a null result");
}
return;
return null;
}
if (result instanceof Properties && !(message.getPayload() instanceof Properties)) {
Properties propertiesToSet = (Properties) result;
@@ -94,17 +94,17 @@ public class AnnotationMethodTransformerAdapter extends AbstractMethodInvokingAd
}
}
else {
message.setPayload(result);
return new GenericMessage(result, message.getHeader());
}
}
catch (Exception e) {
throw new MessagingException(message, "failed to transform message payload", e);
}
}
public Message<?> handle(Message<?> message) {
this.transform(message);
return message;
}
public Message<?> handle(Message<?> message) {
return this.transform(message);
}
}

View File

@@ -25,6 +25,6 @@ import org.springframework.integration.message.Message;
*/
public interface MessageTransformer {
void transform(Message<?> message);
Message<?> transform(Message<?> message);
}

View File

@@ -48,10 +48,14 @@ public class MessageTransformerChain implements MessageTransformer {
this.transformers.addAll(transformers);
}
public void transform(Message<?> message) {
for (MessageTransformer next : transformers) {
next.transform(message);
public Message<?> transform(Message<?> message) {
for (MessageTransformer next : this.transformers) {
message = next.transform(message);
if (message == null) {
return null;
}
}
return message;
}
}

View File

@@ -48,18 +48,19 @@ public class MessageTransformingChannelInterceptor extends ChannelInterceptorAda
}
@Override
public boolean preSend(Message<?> message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
if (this.transformOnSend) {
this.transfomer.transform(message);
message = this.transfomer.transform(message);
}
return true;
return message;
}
@Override
public void postReceive(Message<?> message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
if (!this.transformOnSend) {
this.transfomer.transform(message);
message = this.transfomer.transform(message);
}
return message;
}
}

View File

@@ -16,6 +16,7 @@
package org.springframework.integration.transformer;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.MessagingException;
import org.springframework.integration.util.AbstractMethodInvokingAdapter;
@@ -26,9 +27,10 @@ import org.springframework.integration.util.AbstractMethodInvokingAdapter;
public class PayloadTransformerAdapter extends AbstractMethodInvokingAdapter implements MessageTransformer {
@SuppressWarnings("unchecked")
public void transform(Message message) {
public Message<?> transform(Message<?> message) {
try {
message.setPayload(this.invokeMethod(message.getPayload()));
Object result = this.invokeMethod(message.getPayload());
return new GenericMessage(result, message.getHeader());
} catch (Exception e) {
throw new MessagingException(message, "failed to transform message payload", e);
}

View File

@@ -33,8 +33,7 @@ public class TransformerMessageHandlerAdapter implements MessageHandler {
public Message<?> handle(Message<?> message) {
this.transformer.transform(message);
return message;
return this.transformer.transform(message);
}
}

View File

@@ -33,14 +33,13 @@ import org.springframework.integration.bus.DefaultChannelFactoryBean;
import org.springframework.integration.bus.DefaultMessageBus;
import org.springframework.integration.channel.AbstractMessageChannel;
import org.springframework.integration.channel.ChannelInterceptor;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.PriorityChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.channel.RendezvousChannel;
import org.springframework.integration.channel.ThreadLocalChannel;
import org.springframework.integration.channel.interceptor.ChannelInterceptorAdapter;
import org.springframework.integration.dispatcher.DirectChannel;
import org.springframework.integration.dispatcher.DirectChannelFactory;
import org.springframework.integration.message.Message;
/**
* @author Marius Bogoevici
@@ -137,23 +136,7 @@ public class ChannelFactoryTests {
}
static class TestChannelInterceptor implements ChannelInterceptor {
public void postReceive(Message<?> message, MessageChannel channel) {
}
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
}
public boolean preReceive(MessageChannel channel) {
return false;
}
public boolean preSend(Message<?> message, MessageChannel channel) {
return false;
}
private static class TestChannelInterceptor extends ChannelInterceptorAdapter {
}
}

View File

@@ -41,22 +41,22 @@ public class ChannelInterceptorTests {
@Test
public void testPreSendInterceptorReturnsTrue() {
channel.addInterceptor(new PreSendReturnsTrueInterceptor());
public void testPreSendInterceptorReturnsMessage() {
channel.addInterceptor(new PreSendReturnsMessageInterceptor());
channel.send(new StringMessage("test"));
Message result = channel.receive(0);
Message<?> result = channel.receive(0);
assertNotNull(result);
assertEquals("test", result.getPayload());
assertEquals(1, result.getHeader().getAttribute(PreSendReturnsTrueInterceptor.class.getName()));
assertEquals(1, result.getHeader().getAttribute(PreSendReturnsMessageInterceptor.class.getName()));
}
@Test
public void testPreSendInterceptorReturnsFalse() {
channel.addInterceptor(new PreSendReturnsFalseInterceptor());
Message message = new StringMessage("test");
public void testPreSendInterceptorReturnsNull() {
channel.addInterceptor(new PreSendReturnsNullInterceptor());
Message<?> message = new StringMessage("test");
channel.send(message);
assertEquals(1, message.getHeader().getAttribute(PreSendReturnsFalseInterceptor.class.getName()));
Message result = channel.receive(0);
assertEquals(1, message.getHeader().getAttribute(PreSendReturnsNullInterceptor.class.getName()));
Message<?> result = channel.receive(0);
assertNull(result);
}
@@ -65,7 +65,7 @@ public class ChannelInterceptorTests {
final AtomicBoolean invoked = new AtomicBoolean(false);
channel.addInterceptor(new ChannelInterceptorAdapter() {
@Override
public void postSend(Message message, MessageChannel channel, boolean sent) {
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
assertNotNull(message);
assertNotNull(channel);
assertSame(ChannelInterceptorTests.this.channel, channel);
@@ -84,7 +84,7 @@ public class ChannelInterceptorTests {
final QueueChannel singleItemChannel = new QueueChannel(1);
singleItemChannel.addInterceptor(new ChannelInterceptorAdapter() {
@Override
public void postSend(Message message, MessageChannel channel, boolean sent) {
public void postSend(Message<?> message, MessageChannel channel, boolean sent) {
assertNotNull(message);
assertNotNull(channel);
assertSame(singleItemChannel, channel);
@@ -107,9 +107,9 @@ public class ChannelInterceptorTests {
@Test
public void testPreReceiveInterceptorReturnsTrue() {
channel.addInterceptor(new PreReceiveReturnsTrueInterceptor());
Message message = new StringMessage("test");
Message<?> message = new StringMessage("test");
channel.send(message);
Message result = channel.receive(0);
Message<?> result = channel.receive(0);
assertEquals(1, PreReceiveReturnsTrueInterceptor.counter.get());
assertNotNull(result);
}
@@ -117,9 +117,9 @@ public class ChannelInterceptorTests {
@Test
public void testPreReceiveInterceptorReturnsFalse() {
channel.addInterceptor(new PreReceiveReturnsFalseInterceptor());
Message message = new StringMessage("test");
Message<?> message = new StringMessage("test");
channel.send(message);
Message result = channel.receive(0);
Message<?> result = channel.receive(0);
assertEquals(1, PreReceiveReturnsFalseInterceptor.counter.get());
assertNull(result);
}
@@ -130,48 +130,49 @@ public class ChannelInterceptorTests {
final AtomicInteger messageCount = new AtomicInteger();
channel.addInterceptor(new ChannelInterceptorAdapter() {
@Override
public void postReceive(Message message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
assertNotNull(channel);
assertSame(ChannelInterceptorTests.this.channel, channel);
if (message != null) {
messageCount.incrementAndGet();
}
invokedCount.incrementAndGet();
return message;
}
});
channel.receive(0);
assertEquals(1, invokedCount.get());
assertEquals(0, messageCount.get());
channel.send(new StringMessage("test"));
Message result = channel.receive(0);
Message<?> result = channel.receive(0);
assertNotNull(result);
assertEquals(2, invokedCount.get());
assertEquals(1, messageCount.get());
}
private static class PreSendReturnsTrueInterceptor extends ChannelInterceptorAdapter {
private static class PreSendReturnsMessageInterceptor extends ChannelInterceptorAdapter {
private static AtomicInteger counter = new AtomicInteger();
@Override
public boolean preSend(Message message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
assertNotNull(message);
message.getHeader().setAttribute(this.getClass().getName(), counter.incrementAndGet());
return true;
return message;
}
}
private static class PreSendReturnsFalseInterceptor extends ChannelInterceptorAdapter {
private static class PreSendReturnsNullInterceptor extends ChannelInterceptorAdapter {
private static AtomicInteger counter = new AtomicInteger();
@Override
public boolean preSend(Message message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
assertNotNull(message);
message.getHeader().setAttribute(this.getClass().getName(), counter.incrementAndGet());
return false;
return null;
}
}

View File

@@ -33,14 +33,15 @@ public class TestChannelInterceptor extends ChannelInterceptorAdapter {
@Override
public boolean preSend(Message<?> message, MessageChannel channel) {
public Message<?> preSend(Message<?> message, MessageChannel channel) {
sendCount.incrementAndGet();
return true;
return message;
}
@Override
public void postReceive(Message<?> message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
receiveCount.incrementAndGet();
return message;
}
public int getSendCount() {

View File

@@ -48,10 +48,11 @@ public class TestChannelInterceptor extends ChannelInterceptorAdapter {
}
@Override
public void postReceive(Message<?> message, MessageChannel channel) {
public Message<?> postReceive(Message<?> message, MessageChannel channel) {
if (message != null) {
this.receivedCount.incrementAndGet();
}
return message;
}
}

View File

@@ -45,8 +45,8 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("exclaim", String.class));
Message<?> message = new StringMessage("foo");
adapter.transform(message);
assertEquals("FOO!", message.getPayload());
Message<?> result = adapter.handle(message);
assertEquals("FOO!", result.getPayload());
}
@Test
@@ -56,8 +56,8 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("exclaim", String.class));
Message<?> message = new GenericMessage<Integer>(123);
adapter.transform(message);
assertEquals("123!", message.getPayload());
Message<?> result = adapter.handle(message);
assertEquals("123!", result.getPayload());
}
@Test(expected=MessagingException.class)
@@ -67,7 +67,7 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setObject(testBean);
adapter.setMethod(testBean.getClass().getMethod("exclaim", String.class));
Message<?> message = new GenericMessage<Date>(new Date());
adapter.transform(message);
adapter.handle(message);
}
@Test
@@ -78,8 +78,8 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setMethod(testBean.getClass().getMethod("attributeTest", String.class, Integer.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setAttribute("number", 123);
adapter.transform(message);
assertEquals("foo123", message.getPayload());
Message<?> result = adapter.handle(message);
assertEquals("foo123", result.getPayload());
}
@Test(expected=MessageHandlingException.class)
@@ -90,7 +90,7 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setMethod(testBean.getClass().getMethod("attributeTest", String.class, Integer.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setAttribute("wrong", 123);
adapter.transform(message);
adapter.handle(message);
}
@Test
@@ -101,8 +101,8 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setMethod(testBean.getClass().getMethod("propertyTest", String.class, String.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setProperty("suffix", "bar");
adapter.transform(message);
assertEquals("foobar", message.getPayload());
Message<?> result = adapter.handle(message);
assertEquals("foobar", result.getPayload());
}
@Test(expected=MessageHandlingException.class)
@@ -113,7 +113,7 @@ public class AnnotationMethodTransformerAdapterTests {
adapter.setMethod(testBean.getClass().getMethod("propertyTest", String.class, String.class));
Message<?> message = new StringMessage("foo");
message.getHeader().setProperty("wrong", "bar");
adapter.transform(message);
adapter.handle(message);
}
@Test
@@ -125,14 +125,15 @@ public class AnnotationMethodTransformerAdapterTests {
Message<?> message = new StringMessage("test");
message.getHeader().setProperty("prop1", "bad");
message.getHeader().setProperty("prop3", "baz");
adapter.transform(message);
assertEquals("test", message.getPayload());
assertEquals("foo", message.getHeader().getProperty("prop1"));
assertEquals("bar", message.getHeader().getProperty("prop2"));
assertEquals("baz", message.getHeader().getProperty("prop3"));
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"));
}
@Test
@SuppressWarnings("unchecked")
public void testPropertyPayload() throws Exception {
TestBean testBean = new TestBean();
AnnotationMethodTransformerAdapter adapter = new AnnotationMethodTransformerAdapter();
@@ -142,15 +143,15 @@ public class AnnotationMethodTransformerAdapterTests {
props.setProperty("prop1", "bad");
props.setProperty("prop3", "baz");
Message<Properties> message = new GenericMessage<Properties>(props);
adapter.transform(message);
assertEquals(Properties.class, message.getPayload().getClass());
Properties payload = message.getPayload();
Message<Properties> result = (Message<Properties>) adapter.handle(message);
assertEquals(Properties.class, result.getPayload().getClass());
Properties payload = result.getPayload();
assertEquals("foo", payload.getProperty("prop1"));
assertEquals("bar", payload.getProperty("prop2"));
assertEquals("baz", payload.getProperty("prop3"));
assertNull(message.getHeader().getProperty("prop1"));
assertNull(message.getHeader().getProperty("prop2"));
assertNull(message.getHeader().getProperty("prop3"));
assertNull(result.getHeader().getProperty("prop1"));
assertNull(result.getHeader().getProperty("prop2"));
assertNull(result.getHeader().getProperty("prop3"));
}

View File

@@ -70,15 +70,16 @@ public class MessageTransformingChannelInterceptorTests {
}
private static class TestTransformer implements MessageTransformer{
private static class TestTransformer implements MessageTransformer {
boolean invoked = false;
int invokedCount = 0;
public void transform(Message<?> message) {
public Message<?> transform(Message<?> message) {
invoked = true;
invokedCount++;
return message;
}
}

View File

@@ -38,8 +38,8 @@ public class PayloadTransformerAdapterTests {
adapter.setObject(new TestBean());
adapter.setMethodName("exclaim");
Message<?> message = new StringMessage("foo");
adapter.transform(message);
assertEquals("FOO!", message.getPayload());
Message<?> result = adapter.transform(message);
assertEquals("FOO!", result.getPayload());
}
@Test
@@ -48,8 +48,8 @@ public class PayloadTransformerAdapterTests {
adapter.setObject(new TestBean());
adapter.setMethodName("exclaim");
Message<?> message = new GenericMessage<Integer>(123);
adapter.transform(message);
assertEquals("123!", message.getPayload());
Message<?> result = adapter.transform(message);
assertEquals("123!", result.getPayload());
}
@Test(expected=MessagingException.class)