Added channel reference to Subscription and refactored/simplified TargetAdapter (implements MessageHandler).

This commit is contained in:
Mark Fisher
2008-01-15 21:57:12 +00:00
parent 0a273b016c
commit 6cd1e7be7c
21 changed files with 276 additions and 362 deletions

View File

@@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.springframework.integration.bus.MessageBus;
import org.springframework.integration.bus.Subscription;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
@@ -46,15 +47,16 @@ public class DefaultTargetAdapterTests {
target.afterPropertiesSet();
DefaultTargetAdapter adapter = new DefaultTargetAdapter(target);
SimpleChannel channel = new SimpleChannel();
adapter.setChannel(channel);
Subscription subscription = new Subscription();
subscription.setChannel(channel);
Message<String> message = new GenericMessage<String>("123", "testing");
channel.send(message);
assertNull(queue.poll());
MessageBus bus = new MessageBus();
bus.registerChannel("channel", channel);
bus.registerTargetAdapter("targetAdapter", adapter);
bus.registerHandler("targetAdapter", adapter, subscription);
bus.start();
String result = queue.poll(100, TimeUnit.MILLISECONDS);
String result = queue.poll(500, TimeUnit.MILLISECONDS);
assertNotNull(result);
assertEquals("testing", result);
bus.stop();

View File

@@ -29,13 +29,25 @@
<property name="method" value="store"/>
</bean>
</constructor-arg>
<property name="channel" ref="outputChannel"/>
</bean>
<bean id="targetEndpoint" class="org.springframework.integration.endpoint.DefaultMessageEndpoint">
<property name="handler" ref="targetAdapter"/>
<property name="subscription">
<bean class="org.springframework.integration.bus.Subscription">
<constructor-arg ref="outputChannel"/>
</bean>
</property>
</bean>
<bean id="sink" class="org.springframework.integration.adapter.TestSink"/>
<bean id="endpoint" class="org.springframework.integration.endpoint.DefaultMessageEndpoint">
<property name="inputChannelName" value="inputChannel"/>
<bean class="org.springframework.integration.endpoint.DefaultMessageEndpoint">
<property name="subscription">
<bean class="org.springframework.integration.bus.Subscription">
<constructor-arg ref="inputChannel"/>
</bean>
</property>
<property name="defaultOutputChannelName" value="outputChannel"/>
</bean>

View File

@@ -26,6 +26,7 @@ import org.junit.Test;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.integration.bus.MessageBus;
import org.springframework.integration.bus.Subscription;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.message.StringMessage;
@@ -46,10 +47,9 @@ public class ApplicationEventTargetAdapterTests {
MessageChannel channel = new SimpleChannel();
ApplicationEventTargetAdapter adapter = new ApplicationEventTargetAdapter();
adapter.setApplicationEventPublisher(publisher);
adapter.setChannel(channel);
MessageBus bus = new MessageBus();
bus.registerChannel("channel", channel);
bus.registerTargetAdapter("adapter", adapter);
bus.registerHandler("adapter", adapter, new Subscription(channel));
bus.start();
assertEquals(1, latch.getCount());
channel.send(new StringMessage("123", "testing"));

View File

@@ -39,7 +39,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
DispatcherTask dispatcherTask = new DispatcherTask(channel);
dispatcherTask.addHandler(adapter);
channel.send(new StringMessage("foo"));
@@ -54,7 +53,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
DispatcherTask dispatcherTask = new DispatcherTask(channel);
dispatcherTask.addHandler(adapter);
channel.send(new StringMessage("foo"));
@@ -72,7 +70,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
adapter.setShouldAppendNewLine(true);
DispatcherTask dispatcherTask = new DispatcherTask(channel);
dispatcherTask.addHandler(adapter);
@@ -92,7 +89,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
ChannelPollingMessageRetriever retriever = new ChannelPollingMessageRetriever(channel);
retriever.setMaxMessagesPerTask(2);
DispatcherTask dispatcherTask = new DispatcherTask(retriever);
@@ -109,7 +105,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
adapter.setShouldAppendNewLine(true);
ChannelPollingMessageRetriever retriever = new ChannelPollingMessageRetriever(channel);
retriever.setReceiveTimeout(0);
@@ -129,7 +124,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
DispatcherTask dispatcherTask = new DispatcherTask(channel);
dispatcherTask.addHandler(adapter);
TestObject testObject = new TestObject("foo");
@@ -145,7 +139,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
ChannelPollingMessageRetriever retriever = new ChannelPollingMessageRetriever(channel);
retriever.setReceiveTimeout(0);
retriever.setMaxMessagesPerTask(2);
@@ -165,7 +158,6 @@ public class CharacterStreamTargetAdapterTests {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
MessageChannel channel = new SimpleChannel();
CharacterStreamTargetAdapter adapter = new CharacterStreamTargetAdapter(stream);
adapter.setChannel(channel);
adapter.setShouldAppendNewLine(true);
ChannelPollingMessageRetriever retriever = new ChannelPollingMessageRetriever(channel);
retriever.setReceiveTimeout(0);

View File

@@ -30,7 +30,7 @@ import org.springframework.integration.MessageDeliveryException;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.dispatcher.DefaultMessageDispatcher;
import org.springframework.integration.dispatcher.MessageHandlerRejectedExecutionException;
import org.springframework.integration.endpoint.DefaultMessageEndpoint;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.handler.PooledMessageHandler;
import org.springframework.integration.message.ErrorMessage;
import org.springframework.integration.message.Message;
@@ -467,19 +467,18 @@ public class DefaultMessageDispatcherTests {
assertEquals("endpoint2 should have accepted the message", 1, counter2.get());
}
private static class TestEndpoint extends DefaultMessageEndpoint {
private static class TestEndpoint implements MessageHandler {
private AtomicInteger counter;
private CountDownLatch latch;
public TestEndpoint(AtomicInteger counter, CountDownLatch latch) {
this.counter = counter;
this.latch = latch;
}
@Override
public Message<?> handle(Message<?> message) {
counter.incrementAndGet();
latch.countDown();

View File

@@ -27,8 +27,7 @@ import org.junit.Test;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.endpoint.ConcurrencyPolicy;
import org.springframework.integration.endpoint.DefaultMessageEndpoint;
import org.springframework.integration.endpoint.MessageEndpoint;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.scheduling.PollingSchedule;
@@ -44,8 +43,7 @@ public class FixedDelayConsumerTests {
final AtomicInteger counter = new AtomicInteger(0);
final CountDownLatch latch = new CountDownLatch(messagesToSend);
SimpleChannel channel = new SimpleChannel();
MessageEndpoint endpoint = new DefaultMessageEndpoint() {
@Override
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
counter.incrementAndGet();
latch.countDown();
@@ -55,7 +53,6 @@ public class FixedDelayConsumerTests {
MessageBus bus = new MessageBus();
bus.initialize();
bus.registerChannel("testChannel", channel);
bus.registerEndpoint("testEndpoint", endpoint);
PollingSchedule schedule = new PollingSchedule(10);
schedule.setFixedRate(false);
ConcurrencyPolicy concurrencyPolicy = new ConcurrencyPolicy();
@@ -63,10 +60,8 @@ public class FixedDelayConsumerTests {
concurrencyPolicy.setMaxConcurrency(1);
Subscription subscription = new Subscription();
subscription.setSchedule(schedule);
subscription.setConcurrencyPolicy(concurrencyPolicy);
subscription.setChannel("testChannel");
subscription.setHandler("testEndpoint");
bus.activateSubscription(subscription);
subscription.setChannelName("testChannel");
bus.registerHandler("testHandler", handler, subscription, concurrencyPolicy);
bus.start();
for (int i = 0; i < messagesToSend; i++) {
channel.send(new GenericMessage<String>(1, "test " + (i+1)));
@@ -81,8 +76,7 @@ public class FixedDelayConsumerTests {
final AtomicInteger counter = new AtomicInteger(0);
final CountDownLatch latch = new CountDownLatch(messagesToSend);
SimpleChannel channel = new SimpleChannel();
MessageEndpoint endpoint = new DefaultMessageEndpoint() {
@Override
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
counter.incrementAndGet();
latch.countDown();
@@ -92,14 +86,12 @@ public class FixedDelayConsumerTests {
MessageBus bus = new MessageBus();
bus.initialize();
bus.registerChannel("testChannel", channel);
bus.registerEndpoint("testEndpoint", endpoint);
PollingSchedule schedule = new PollingSchedule(10);
schedule.setFixedRate(false);
Subscription subscription = new Subscription();
subscription.setChannel("testChannel");
subscription.setHandler("testEndpoint");
Subscription subscription = new Subscription(channel);
subscription.setChannelName("testChannel");
subscription.setSchedule(schedule);
bus.activateSubscription(subscription);
bus.registerHandler("testHandler", handler, subscription);
for (int i = 0; i < messagesToSend; i++) {
channel.send(new GenericMessage<String>(1, "test " + (i+1)));
}

View File

@@ -27,8 +27,7 @@ import org.junit.Test;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.endpoint.ConcurrencyPolicy;
import org.springframework.integration.endpoint.DefaultMessageEndpoint;
import org.springframework.integration.endpoint.MessageEndpoint;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.message.Message;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.scheduling.PollingSchedule;
@@ -44,8 +43,7 @@ public class FixedRateConsumerTests {
final AtomicInteger counter = new AtomicInteger(0);
final CountDownLatch latch = new CountDownLatch(messagesToSend);
SimpleChannel channel = new SimpleChannel();
MessageEndpoint endpoint = new DefaultMessageEndpoint() {
@Override
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
counter.incrementAndGet();
latch.countDown();
@@ -55,14 +53,12 @@ public class FixedRateConsumerTests {
MessageBus bus = new MessageBus();
bus.initialize();
bus.registerChannel("testChannel", channel);
bus.registerEndpoint("testEndpoint", endpoint);
PollingSchedule schedule = new PollingSchedule(10);
schedule.setFixedRate(true);
Subscription subscription = new Subscription();
subscription.setChannel("testChannel");
subscription.setHandler("testEndpoint");
subscription.setChannelName("testChannel");
subscription.setSchedule(schedule);
bus.activateSubscription(subscription);
bus.registerHandler("testHandler", handler, subscription);
bus.start();
for (int i = 0; i < messagesToSend; i++) {
channel.send(new GenericMessage<String>(1, "test " + (i+1)));
@@ -77,8 +73,7 @@ public class FixedRateConsumerTests {
final AtomicInteger counter = new AtomicInteger(0);
final CountDownLatch latch = new CountDownLatch(messagesToSend);
SimpleChannel channel = new SimpleChannel();
MessageEndpoint endpoint = new DefaultMessageEndpoint() {
@Override
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
counter.incrementAndGet();
latch.countDown();
@@ -86,20 +81,16 @@ public class FixedRateConsumerTests {
}
};
MessageBus bus = new MessageBus();
bus.initialize();
bus.registerChannel("testChannel", channel);
bus.registerEndpoint("testEndpoint", endpoint);
PollingSchedule schedule = new PollingSchedule(5);
schedule.setFixedRate(true);
ConcurrencyPolicy concurrencyPolicy = new ConcurrencyPolicy();
concurrencyPolicy.setCoreConcurrency(1);
concurrencyPolicy.setMaxConcurrency(1);
Subscription subscription = new Subscription();
subscription.setChannel("testChannel");
subscription.setHandler("testEndpoint");
subscription.setChannelName("testChannel");
subscription.setSchedule(schedule);
subscription.setConcurrencyPolicy(concurrencyPolicy);
bus.activateSubscription(subscription);
bus.registerChannel("testChannel", channel);
bus.registerHandler("testHandler", handler, subscription, concurrencyPolicy);
bus.start();
for (int i = 0; i < messagesToSend; i++) {
channel.send(new GenericMessage<String>(1, "test " + (i+1)));

View File

@@ -33,7 +33,7 @@ import org.springframework.integration.adapter.PollingSourceAdapter;
import org.springframework.integration.adapter.SourceAdapter;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.endpoint.DefaultMessageEndpoint;
import org.springframework.integration.handler.MessageHandler;
import org.springframework.integration.message.ErrorMessage;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.Message;
@@ -45,25 +45,30 @@ import org.springframework.integration.message.StringMessage;
public class MessageBusTests {
@Test
public void testChannelsConnectedWithEndpoint() {
public void testOutputChannel() {
MessageBus bus = new MessageBus();
MessageChannel sourceChannel = new SimpleChannel();
MessageChannel targetChannel = new SimpleChannel();
bus.registerChannel("sourceChannel", sourceChannel);
sourceChannel.send(new StringMessage("123", "test"));
StringMessage message = new StringMessage("test");
message.getHeader().setReplyChannelName("targetChannel");
sourceChannel.send(message);
bus.registerChannel("targetChannel", targetChannel);
DefaultMessageEndpoint endpoint = new DefaultMessageEndpoint();
endpoint.setInputChannelName("sourceChannel");
endpoint.setDefaultOutputChannelName("targetChannel");
bus.registerEndpoint("endpoint", endpoint);
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
return message;
}
};
Subscription subscription = new Subscription(sourceChannel);
bus.registerHandler("handler", handler, subscription);
bus.start();
Message<?> result = targetChannel.receive(100);
Message<?> result = targetChannel.receive(3000);
assertEquals("test", result.getPayload());
bus.stop();
}
@Test
public void testChannelsWithoutEndpoint() {
public void testChannelsWithoutHandlers() {
MessageBus bus = new MessageBus();
MessageChannel sourceChannel = new SimpleChannel();
sourceChannel.send(new StringMessage("123", "test"));
@@ -84,31 +89,34 @@ public class MessageBusTests {
sourceChannel.send(new GenericMessage<String>("123", "test"));
MessageChannel targetChannel = (MessageChannel) context.getBean("targetChannel");
MessageBus bus = (MessageBus) context.getBean("bus");
Subscription subscription = new Subscription();
subscription.setChannel("sourceChannel");
subscription.setHandler("endpoint");
bus.activateSubscription(subscription);
Message<?> result = targetChannel.receive(100);
bus.start();
Message<?> result = targetChannel.receive(1000);
assertEquals("test", result.getPayload());
}
@Test
public void testExactlyOneEndpointReceivesUnicastMessage() {
public void testExactlyOneHandlerReceivesPointToPointMessage() {
SimpleChannel inputChannel = new SimpleChannel();
SimpleChannel outputChannel1 = new SimpleChannel();
SimpleChannel outputChannel2 = new SimpleChannel();
DefaultMessageEndpoint endpoint1 = new DefaultMessageEndpoint();
endpoint1.setDefaultOutputChannelName("output1");
endpoint1.setInputChannelName("input");
DefaultMessageEndpoint endpoint2 = new DefaultMessageEndpoint();
endpoint2.setDefaultOutputChannelName("output2");
endpoint2.setInputChannelName("input");
MessageHandler handler1 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReplyChannelName("output1");
return message;
}
};
MessageHandler handler2 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReplyChannelName("output2");
return message;
}
};
MessageBus bus = new MessageBus();
bus.registerChannel("input", inputChannel);
bus.registerChannel("output1", outputChannel1);
bus.registerChannel("output2", outputChannel2);
bus.registerEndpoint("endpoint1", endpoint1);
bus.registerEndpoint("endpoint2", endpoint2);
bus.registerHandler("handler1", handler1, new Subscription(inputChannel));
bus.registerHandler("handler2", handler2, new Subscription(inputChannel));
bus.start();
inputChannel.send(new StringMessage(1, "testing"));
Message<?> message1 = outputChannel1.receive(100);
@@ -117,6 +125,39 @@ public class MessageBusTests {
assertTrue("exactly one message should be null", message1 == null ^ message2 == null);
}
@Test
public void testBothHandlersReceivePublishSubscribeMessage() {
SimpleChannel inputChannel = new SimpleChannel();
inputChannel.setBroadcaster(true);
SimpleChannel outputChannel1 = new SimpleChannel();
SimpleChannel outputChannel2 = new SimpleChannel();
MessageHandler handler1 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReplyChannelName("output1");
return message;
}
};
MessageHandler handler2 = new MessageHandler() {
public Message<?> handle(Message<?> message) {
message.getHeader().setReplyChannelName("output2");
return message;
}
};
MessageBus bus = new MessageBus();
bus.registerChannel("input", inputChannel);
bus.registerChannel("output1", outputChannel1);
bus.registerChannel("output2", outputChannel2);
bus.registerHandler("handler1", handler1, new Subscription(inputChannel));
bus.registerHandler("handler2", handler2, new Subscription(inputChannel));
bus.start();
inputChannel.send(new StringMessage(1, "testing"));
Message<?> message1 = outputChannel1.receive(100);
Message<?> message2 = outputChannel2.receive(0);
bus.stop();
assertTrue("both handlers should have received and replied to the message",
(message1 != null && message2 != null));
}
@Test
public void testInvalidMessageChannelWithFailedDispatch() throws InterruptedException {
MessageBus bus = new MessageBus();

View File

@@ -11,7 +11,11 @@
<bean id="targetChannel" class="org.springframework.integration.channel.SimpleChannel"/>
<bean id="endpoint" class="org.springframework.integration.endpoint.DefaultMessageEndpoint">
<property name="inputChannelName" value="sourceChannel"/>
<property name="subscription">
<bean class="org.springframework.integration.bus.Subscription">
<constructor-arg ref="sourceChannel"/>
</bean>
</property>
<property name="defaultOutputChannelName" value="targetChannel"/>
</bean>

View File

@@ -21,7 +21,8 @@ import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.springframework.integration.bus.MessageBus;
import org.springframework.integration.channel.ChannelRegistry;
import org.springframework.integration.channel.DefaultChannelRegistry;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.SimpleChannel;
import org.springframework.integration.handler.MessageHandler;
@@ -35,49 +36,40 @@ public class DefaultMessageEndpointTests {
@Test
public void testDefaultReplyChannel() throws Exception {
MessageChannel channel = new SimpleChannel();
MessageChannel replyChannel = new SimpleChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("replyChannel", replyChannel);
MessageHandler handler = new MessageHandler() {
public Message<String> handle(Message<?> message) {
return new StringMessage("123", "hello " + message.getPayload());
}
};
DefaultMessageEndpoint endpoint = new DefaultMessageEndpoint();
endpoint.setInputChannelName("testChannel");
endpoint.setChannelRegistry(channelRegistry);
endpoint.setHandler(handler);
endpoint.setDefaultOutputChannelName("replyChannel");
MessageBus bus = new MessageBus();
bus.registerChannel("testChannel", channel);
bus.registerEndpoint("testEndpoint", endpoint);
bus.registerChannel("replyChannel", replyChannel);
bus.start();
StringMessage testMessage = new StringMessage(1, "test");
channel.send(testMessage);
Message<String> reply = replyChannel.receive(50);
endpoint.handle(new StringMessage(1, "test"));
Message<?> reply = replyChannel.receive(50);
assertNotNull(reply);
assertEquals("hello test", reply.getPayload());
}
@Test
public void testExplicitReplyChannel() throws Exception {
MessageChannel channel = new SimpleChannel();
final MessageChannel replyChannel = new SimpleChannel();
ChannelRegistry channelRegistry = new DefaultChannelRegistry();
channelRegistry.registerChannel("replyChannel", replyChannel);
MessageHandler handler = new MessageHandler() {
public Message<?> handle(Message<?> message) {
return new StringMessage("123", "hello " + message.getPayload());
}
};
DefaultMessageEndpoint endpoint = new DefaultMessageEndpoint();
endpoint.setInputChannelName("testChannel");
endpoint.setChannelRegistry(channelRegistry);
endpoint.setHandler(handler);
MessageBus bus = new MessageBus();
bus.registerChannel("testChannel", channel);
bus.registerEndpoint("testEndpoint", endpoint);
bus.registerChannel("replyChannel", replyChannel);
bus.start();
StringMessage testMessage = new StringMessage(1, "test");
testMessage.getHeader().setReplyChannelName("replyChannel");
channel.send(testMessage);
endpoint.handle(testMessage);
Message<?> reply = replyChannel.receive(50);
assertNotNull(reply);
assertEquals("hello test", reply.getPayload());