INT-1165, INT-1175 The 'send-timeout' on a chain element (if provided explicitly) will now take precedence over the send-timeout of its last handler (assuming it's a producer in the first place). Also, duplicate handlers are now rejected in a chain.

This commit is contained in:
Mark Fisher
2010-06-14 23:02:28 +00:00
parent 2fbf5da2c7
commit 53842d3b70
6 changed files with 120 additions and 52 deletions

View File

@@ -74,6 +74,11 @@
</payload-type-router>
</chain>
<chain id="chainWithSendTimeout" input-channel="chainWithSendTimeoutInput" output-channel="output" send-timeout="9876">
<filter ref="typeSelector" />
<service-activator ref="testHandler" />
</chain>
<channel id="strings">
<queue/>
</channel>

View File

@@ -27,12 +27,16 @@ import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.integration.channel.PollableChannel;
import org.springframework.integration.core.Message;
import org.springframework.integration.core.MessageChannel;
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
import org.springframework.integration.handler.MessageHandlerChain;
import org.springframework.integration.message.MessageBuilder;
import org.springframework.integration.message.MessageMatcher;
import org.springframework.test.context.ContextConfiguration;
@@ -88,6 +92,9 @@ public class ChainParserTests {
@Autowired
private PollableChannel numbers;
@Autowired
private ApplicationContext context;
public static Message<?> successMessage = MessageBuilder.withPayload("success").build();
@Factory
@@ -175,6 +182,15 @@ public class ChainParserTests {
assertEquals(123, reply2.getPayload());
}
@Test // INT-1165
public void chainWithSendTimeout() {
Object endpoint = this.context.getBean("chainWithSendTimeout");
MessageHandlerChain chain = (MessageHandlerChain) new DirectFieldAccessor(endpoint).getPropertyValue("handler");
long sendTimeout = ((Long) new DirectFieldAccessor(chain).getPropertyValue("sendTimeout")).longValue();
assertEquals(9876, sendTimeout);
}
public static class StubHandler extends AbstractReplyProducingMessageHandler {
@Override
protected Object handleRequestMessage(Message<?> requestMessage) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,22 +40,34 @@ public class MessageHandlerChainTests {
private Message<String> message = MessageBuilder.withPayload("foo").build();
private MessageHandler handler = createMock(MessageHandler.class);
private MessageHandler handler1 = createMock(MessageHandler.class);
private ProducingHandlerStub producer = new ProducingHandlerStub(handler);
private MessageHandler handler2 = createMock(MessageHandler.class);
private Object[] allMocks = new Object[] { outputChannel, handler };
private MessageHandler handler3 = createMock(MessageHandler.class);
private ProducingHandlerStub producer1 = new ProducingHandlerStub(handler1);
private ProducingHandlerStub producer2 = new ProducingHandlerStub(handler2);
private ProducingHandlerStub producer3 = new ProducingHandlerStub(handler3);
private Object[] allMocks = new Object[] { outputChannel, handler1, handler2, handler3 };
@Test
public void chainWithOutputChannel() {
handler.handleMessage(message);
expectLastCall().times(3);
expect(outputChannel.send(eq(message))).andReturn(true);
handler1.handleMessage(message);
expectLastCall();
handler2.handleMessage(message);
expectLastCall();
handler3.handleMessage(message);
expectLastCall();
expect(outputChannel.send(eq(message), eq(-1L))).andReturn(true);
replay(allMocks);
List<MessageHandler> handlers = new ArrayList<MessageHandler>();
handlers.add(producer);
handlers.add(producer);
handlers.add(producer);
handlers.add(producer1);
handlers.add(producer2);
handlers.add(producer3);
MessageHandlerChain chain = new MessageHandlerChain();
chain.setBeanName("testChain");
chain.setHandlers(handlers);
@@ -67,24 +79,29 @@ public class MessageHandlerChainTests {
public void chainWithOutputChannelButLastHandlerDoesNotProduceReplies() {
replay(allMocks);
List<MessageHandler> handlers = new ArrayList<MessageHandler>();
handlers.add(producer);
handlers.add(producer);
handlers.add(handler);
handlers.add(producer1);
handlers.add(producer2);
handlers.add(handler3);
MessageHandlerChain chain = new MessageHandlerChain();
chain.setBeanName("testChain");
chain.setHandlers(handlers);
chain.setOutputChannel(outputChannel);
chain.handleMessage(message);
}
@Test
public void chainWithoutOutputChannelButLastHandlerDoesNotProduceReplies() {
handler.handleMessage(message);
expectLastCall().times(3);
handler1.handleMessage(message);
expectLastCall();
handler2.handleMessage(message);
expectLastCall();
handler3.handleMessage(message);
expectLastCall();
replay(allMocks);
List<MessageHandler> handlers = new ArrayList<MessageHandler>();
handlers.add(producer);
handlers.add(producer);
handlers.add(handler);
handlers.add(producer1);
handlers.add(producer2);
handlers.add(handler3);
MessageHandlerChain chain = new MessageHandlerChain();
chain.setBeanName("testChain");
chain.setHandlers(handlers);
@@ -94,15 +111,19 @@ public class MessageHandlerChainTests {
@Test
public void chainForwardsToReplyChannel() {
Message<String> message = MessageBuilder.withPayload("test").setReplyChannel(outputChannel).build();
handler.handleMessage(message);
expectLastCall().times(3);
handler1.handleMessage(message);
expectLastCall();
handler2.handleMessage(message);
expectLastCall();
handler3.handleMessage(message);
expectLastCall();
//equality is lost when recreating the message
expect(outputChannel.send(isA(Message.class))).andReturn(true);
replay(allMocks);
List<MessageHandler> handlers = new ArrayList<MessageHandler>();
handlers.add(producer);
handlers.add(producer);
handlers.add(producer);
handlers.add(producer1);
handlers.add(producer2);
handlers.add(producer3);
MessageHandlerChain chain = new MessageHandlerChain();
chain.setBeanName("testChain");
chain.setHandlers(handlers);
@@ -112,16 +133,36 @@ public class MessageHandlerChainTests {
@Test
public void chainResolvesReplyChannelName() {
Message<String> message = MessageBuilder.withPayload("test").setReplyChannelName("testChannel").build();
handler.handleMessage(message);
expectLastCall().times(3);
handler1.handleMessage(message);
expectLastCall();
handler2.handleMessage(message);
expectLastCall();
handler3.handleMessage(message);
expectLastCall();
expect(outputChannel.send(eq(message))).andReturn(true);
replay(allMocks);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerSingleton("testChannel", outputChannel);
List<MessageHandler> handlers = new ArrayList<MessageHandler>();
handlers.add(producer);
handlers.add(producer);
handlers.add(producer);
handlers.add(producer1);
handlers.add(producer2);
handlers.add(producer3);
MessageHandlerChain chain = new MessageHandlerChain();
chain.setBeanName("testChain");
chain.setHandlers(handlers);
chain.setBeanFactory(beanFactory);
chain.handleMessage(message);
}
@Test(expected = IllegalArgumentException.class) // INT-1175
public void chainRejectsDuplicateHandlers() {
Message<String> message = MessageBuilder.withPayload("test").setReplyChannelName("testChannel").build();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerSingleton("testChannel", outputChannel);
List<MessageHandler> handlers = new ArrayList<MessageHandler>();
handlers.add(producer1);
handlers.add(producer2);
handlers.add(producer1);
MessageHandlerChain chain = new MessageHandlerChain();
chain.setBeanName("testChain");
chain.setHandlers(handlers);