Major refactoring of endpoint subscription, scheduling, and activation. This includes significant changes to the dispatcher implementations and the addition of endpoint "triggers" to drive polling and dispatching of messages. Also introduces an explicit PublishSubscribeChannel implementation and thereby removes support for the "publish-subscribe" attribute from channel elements in the namespace.

This commit is contained in:
Mark Fisher
2008-07-04 18:48:33 +00:00
parent 218da1aacf
commit 0aa00b969b
34 changed files with 782 additions and 1222 deletions

View File

@@ -44,7 +44,7 @@ public class ByteStreamSourceTests {
ByteStreamSource source = new ByteStreamSource(stream);
SourceEndpoint endpoint = new SourceEndpoint(source, channel);
endpoint.afterPropertiesSet();
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message1 = channel.receive(500);
byte[] payload = (byte[]) message1.getPayload();
assertEquals(3, payload.length);
@@ -53,7 +53,7 @@ public class ByteStreamSourceTests {
assertEquals(3, payload[2]);
Message<?> message2 = channel.receive(0);
assertNull(message2);
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message3 = channel.receive(0);
assertNull(message3);
}
@@ -69,12 +69,12 @@ public class ByteStreamSourceTests {
schedule.setInitialDelay(10000);
SourceEndpoint endpoint = new SourceEndpoint(source, channel);
endpoint.afterPropertiesSet();
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message1 = channel.receive(0);
assertEquals(4, ((byte[]) message1.getPayload()).length);
Message<?> message2 = channel.receive(0);
assertNull(message2);
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message3 = channel.receive(0);
assertEquals(2, ((byte[]) message3.getPayload()).length);
}
@@ -91,12 +91,12 @@ public class ByteStreamSourceTests {
schedule.setInitialDelay(10000);
SourceEndpoint endpoint = new SourceEndpoint(source, channel);
endpoint.afterPropertiesSet();
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message1 = channel.receive(0);
assertEquals(4, ((byte[]) message1.getPayload()).length);
Message<?> message2 = channel.receive(0);
assertNull(message2);
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message3 = channel.receive(0);
assertEquals(4, ((byte[]) message3.getPayload()).length);
assertEquals(0, ((byte[]) message3.getPayload())[3]);

View File

@@ -21,19 +21,34 @@ import static org.junit.Assert.assertEquals;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import org.springframework.integration.channel.DispatcherPolicy;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.dispatcher.PollingDispatcherTask;
import org.springframework.integration.dispatcher.BroadcastingDispatcher;
import org.springframework.integration.dispatcher.PollingDispatcher;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.scheduling.PollingSchedule;
/**
* @author Mark Fisher
*/
public class ByteStreamTargetTests {
private MessageChannel channel;
private PollingDispatcher dispatcher;
@Before
public void initialize() {
this.channel = new QueueChannel(10);
this.dispatcher = new PollingDispatcher(channel, new BroadcastingDispatcher(), new PollingSchedule(0));
}
@Test
public void testSingleByteArray() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
@@ -60,15 +75,12 @@ public class ByteStreamTargetTests {
public void testMaxMessagesPerTaskSameAsMessageCount() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(3);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(3);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result = stream.toByteArray();
assertEquals(9, result.length);
assertEquals(1, result[0]);
@@ -79,15 +91,12 @@ public class ByteStreamTargetTests {
public void testMaxMessagesPerTaskLessThanMessageCount() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(2);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result = stream.toByteArray();
assertEquals(6, result.length);
assertEquals(1, result[0]);
@@ -97,16 +106,13 @@ public class ByteStreamTargetTests {
public void testMaxMessagesPerTaskExceedsMessageCount() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(5);
task.setReceiveTimeout(0);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(5);
dispatcher.setReceiveTimeout(0);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result = stream.toByteArray();
assertEquals(9, result.length);
assertEquals(1, result[0]);
@@ -116,20 +122,17 @@ public class ByteStreamTargetTests {
public void testMaxMessagesLessThanMessageCountWithMultipleDispatches() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(2);
task.setReceiveTimeout(0);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.setReceiveTimeout(0);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result1 = stream.toByteArray();
assertEquals(6, result1.length);
assertEquals(1, result1[0]);
task.run();
dispatcher.run();
byte[] result2 = stream.toByteArray();
assertEquals(9, result2.length);
assertEquals(1, result2[0]);
@@ -140,20 +143,17 @@ public class ByteStreamTargetTests {
public void testMaxMessagesExceedsMessageCountWithMultipleDispatches() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(5);
task.setReceiveTimeout(0);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(5);
dispatcher.setReceiveTimeout(0);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result1 = stream.toByteArray();
assertEquals(9, result1.length);
assertEquals(1, result1[0]);
task.run();
dispatcher.run();
byte[] result2 = stream.toByteArray();
assertEquals(9, result2.length);
assertEquals(1, result2[0]);
@@ -163,20 +163,17 @@ public class ByteStreamTargetTests {
public void testStreamResetBetweenDispatches() {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(2);
task.setReceiveTimeout(0);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.setReceiveTimeout(0);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result1 = stream.toByteArray();
assertEquals(6, result1.length);
stream.reset();
task.run();
dispatcher.run();
byte[] result2 = stream.toByteArray();
assertEquals(3, result2.length);
assertEquals(7, result2[0]);
@@ -186,21 +183,18 @@ public class ByteStreamTargetTests {
public void testStreamWriteBetweenDispatches() throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteStreamTarget target = new ByteStreamTarget(stream);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(2);
task.setReceiveTimeout(0);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.setReceiveTimeout(0);
dispatcher.addTarget(target);
channel.send(new GenericMessage<byte[]>(new byte[] {1,2,3}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {4,5,6}), 0);
channel.send(new GenericMessage<byte[]>(new byte[] {7,8,9}), 0);
task.run();
dispatcher.run();
byte[] result1 = stream.toByteArray();
assertEquals(6, result1.length);
stream.write(new byte[] {123});
stream.flush();
task.run();
dispatcher.run();
byte[] result2 = stream.toByteArray();
assertEquals(10, result2.length);
assertEquals(1, result2[0]);

View File

@@ -45,12 +45,12 @@ public class CharacterStreamSourceTests {
schedule.setInitialDelay(10000);
SourceEndpoint endpoint = new SourceEndpoint(source, channel);
endpoint.afterPropertiesSet();
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message1 = channel.receive(0);
assertEquals("test", message1.getPayload());
Message<?> message2 = channel.receive(0);
assertNull(message2);
endpoint.invoke(new CommandMessage(new PollCommand()));
endpoint.send(new CommandMessage(new PollCommand()));
Message<?> message3 = channel.receive(0);
assertNull(message3);
}

View File

@@ -20,20 +20,34 @@ import static org.junit.Assert.assertEquals;
import java.io.StringWriter;
import org.junit.Before;
import org.junit.Test;
import org.springframework.integration.channel.DispatcherPolicy;
import org.springframework.integration.channel.MessageChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.dispatcher.PollingDispatcherTask;
import org.springframework.integration.dispatcher.BroadcastingDispatcher;
import org.springframework.integration.dispatcher.PollingDispatcher;
import org.springframework.integration.message.GenericMessage;
import org.springframework.integration.message.StringMessage;
import org.springframework.integration.scheduling.PollingSchedule;
/**
* @author Mark Fisher
*/
public class CharacterStreamTargetTests {
private MessageChannel channel;
private PollingDispatcher dispatcher;
@Before
public void initialize() {
this.channel = new QueueChannel(10);
this.dispatcher = new PollingDispatcher(channel, new BroadcastingDispatcher(), new PollingSchedule(0));
}
@Test
public void testSingleString() {
StringWriter writer = new StringWriter();
@@ -44,33 +58,29 @@ public class CharacterStreamTargetTests {
@Test
public void testTwoStringsAndNoNewLinesByDefault() {
MessageChannel channel = new QueueChannel();
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.subscribe(target);
dispatcher.addTarget(target);
channel.send(new StringMessage("foo"), 0);
channel.send(new StringMessage("bar"), 0);
task.run();
dispatcher.run();
assertEquals("foo", writer.toString());
task.run();
dispatcher.run();
assertEquals("foobar", writer.toString());
}
@Test
public void testTwoStringsWithNewLines() {
MessageChannel channel = new QueueChannel();
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
target.setShouldAppendNewLine(true);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.subscribe(target);
dispatcher.addTarget(target);
channel.send(new StringMessage("foo"), 0);
channel.send(new StringMessage("bar"), 0);
task.run();
dispatcher.run();
String newLine = System.getProperty("line.separator");
assertEquals("foo" + newLine, writer.toString());
task.run();
dispatcher.run();
assertEquals("foo" + newLine + "bar" + newLine, writer.toString());
}
@@ -78,14 +88,11 @@ public class CharacterStreamTargetTests {
public void testMaxMessagesPerTaskSameAsMessageCount() {
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(2);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.addTarget(target);
channel.send(new StringMessage("foo"), 0);
channel.send(new StringMessage("bar"), 0);
task.run();
dispatcher.run();
assertEquals("foobar", writer.toString());
}
@@ -93,30 +100,25 @@ public class CharacterStreamTargetTests {
public void testMaxMessagesPerTaskExceedsMessageCountWithAppendedNewLines() {
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setMaxMessagesPerTask(10);
task.setReceiveTimeout(0);
task.subscribe(target);
dispatcher.setMaxMessagesPerTask(10);
dispatcher.setReceiveTimeout(0);
dispatcher.addTarget(target);
target.setShouldAppendNewLine(true);
channel.send(new StringMessage("foo"), 0);
channel.send(new StringMessage("bar"), 0);
task.run();
dispatcher.run();
String newLine = System.getProperty("line.separator");
assertEquals("foo" + newLine + "bar" + newLine, writer.toString());
}
@Test
public void testSingleNonStringObject() {
MessageChannel channel = new QueueChannel();
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.subscribe(target);
dispatcher.addTarget(target);
TestObject testObject = new TestObject("foo");
channel.send(new GenericMessage<TestObject>(testObject));
task.run();
dispatcher.run();
assertEquals("foo", writer.toString());
}
@@ -124,17 +126,14 @@ public class CharacterStreamTargetTests {
public void testTwoNonStringObjectWithOutNewLines() {
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setReceiveTimeout(0);
task.setMaxMessagesPerTask(2);
task.subscribe(target);
dispatcher.setReceiveTimeout(0);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.addTarget(target);
TestObject testObject1 = new TestObject("foo");
TestObject testObject2 = new TestObject("bar");
channel.send(new GenericMessage<TestObject>(testObject1), 0);
channel.send(new GenericMessage<TestObject>(testObject2), 0);
task.run();
dispatcher.run();
assertEquals("foobar", writer.toString());
}
@@ -142,18 +141,15 @@ public class CharacterStreamTargetTests {
public void testTwoNonStringObjectWithNewLines() {
StringWriter writer = new StringWriter();
CharacterStreamTarget target = new CharacterStreamTarget(writer);
DispatcherPolicy dispatcherPolicy = new DispatcherPolicy();
QueueChannel channel = new QueueChannel(5, dispatcherPolicy);
target.setShouldAppendNewLine(true);
PollingDispatcherTask task = new PollingDispatcherTask(channel, null);
task.setReceiveTimeout(0);
task.setMaxMessagesPerTask(2);
task.subscribe(target);
dispatcher.setReceiveTimeout(0);
dispatcher.setMaxMessagesPerTask(2);
dispatcher.addTarget(target);
TestObject testObject1 = new TestObject("foo");
TestObject testObject2 = new TestObject("bar");
channel.send(new GenericMessage<TestObject>(testObject1), 0);
channel.send(new GenericMessage<TestObject>(testObject2), 0);
task.run();
dispatcher.run();
String newLine = System.getProperty("line.separator");
assertEquals("foo" + newLine + "bar" + newLine, writer.toString());
}