INT-1145 INT-1146 Add 'close' attribute to tcp gateways and inbound adapters
This commit is contained in:
@@ -74,6 +74,7 @@
|
||||
so-timeout="32"
|
||||
using-direct-buffers="true"
|
||||
using-nio="true"
|
||||
close="true"
|
||||
/>
|
||||
|
||||
<ip:inbound-channel-adapter id="testInTcpNet"
|
||||
@@ -197,13 +198,45 @@
|
||||
custom-socket-writer-class-name="org.springframework.integration.ip.tcp.CustomNetSocketWriter"
|
||||
message-format="crlf"
|
||||
host="localhost"
|
||||
port="#{tcpIpUtils.findAvailableServerSocket(6500)}"
|
||||
port="#{tcpIpUtils.findAvailableServerSocket(6600)}"
|
||||
receive-buffer-size="223"
|
||||
so-keep-alive="true"
|
||||
so-receive-buffer-size="224"
|
||||
so-send-buffer-size="225"
|
||||
so-timeout="226"
|
||||
|
||||
close="false"
|
||||
/>
|
||||
|
||||
<ip:inbound-gateway id="simpleInGatewayClose"
|
||||
request-channel="tcpChannel"
|
||||
reply-channel="replyChannel"
|
||||
custom-socket-reader-class-name="org.springframework.integration.ip.tcp.CustomNetSocketReader"
|
||||
custom-socket-writer-class-name="org.springframework.integration.ip.tcp.CustomNetSocketWriter"
|
||||
message-format="crlf"
|
||||
pool-size="23"
|
||||
port="#{tcpIpUtils.findAvailableServerSocket(6700)}"
|
||||
receive-buffer-size="123"
|
||||
so-keep-alive="true"
|
||||
so-receive-buffer-size="124"
|
||||
so-send-buffer-size="125"
|
||||
so-timeout="126"
|
||||
close="true"
|
||||
/>
|
||||
|
||||
<ip:outbound-gateway id="simpleOutGatewayClose"
|
||||
request-channel="tcpChannel"
|
||||
reply-channel="replyChannel"
|
||||
custom-socket-reader-class-name="org.springframework.integration.ip.tcp.CustomNetSocketReader"
|
||||
custom-socket-writer-class-name="org.springframework.integration.ip.tcp.CustomNetSocketWriter"
|
||||
message-format="crlf"
|
||||
host="localhost"
|
||||
port="#{tcpIpUtils.findAvailableServerSocket(6800)}"
|
||||
receive-buffer-size="223"
|
||||
so-keep-alive="true"
|
||||
so-receive-buffer-size="224"
|
||||
so-send-buffer-size="225"
|
||||
so-timeout="226"
|
||||
close="true"
|
||||
/>
|
||||
|
||||
</beans>
|
||||
|
||||
@@ -95,12 +95,21 @@ public class ParserUnitTests {
|
||||
TcpNetSendingMessageHandler tcpOutNet;
|
||||
|
||||
@Autowired
|
||||
@Qualifier(value="simpleInGateway")
|
||||
SimpleTcpNetInboundGateway simpleTcpNetInboundGateway;
|
||||
|
||||
@Autowired
|
||||
@Qualifier(value="org.springframework.integration.ip.tcp.SimpleTcpNetOutboundGateway#0")
|
||||
SimpleTcpNetOutboundGateway simpleTcpNetOutboundGateway;
|
||||
|
||||
@Autowired
|
||||
@Qualifier(value="simpleInGatewayClose")
|
||||
SimpleTcpNetInboundGateway simpleTcpNetInboundGatewayClose;
|
||||
|
||||
@Autowired
|
||||
@Qualifier(value="org.springframework.integration.ip.tcp.SimpleTcpNetOutboundGateway#1")
|
||||
SimpleTcpNetOutboundGateway simpleTcpNetOutboundGatewayClose;
|
||||
|
||||
@Test
|
||||
public void testInUdp() {
|
||||
DirectFieldAccessor dfa = new DirectFieldAccessor(udpIn);
|
||||
@@ -136,6 +145,7 @@ public class ParserUnitTests {
|
||||
assertEquals(29, dfa.getPropertyValue("receiveBufferSize"));
|
||||
assertEquals(30, dfa.getPropertyValue("soReceiveBufferSize"));
|
||||
assertEquals(32, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(false, dfa.getPropertyValue("close"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -150,6 +160,7 @@ public class ParserUnitTests {
|
||||
assertEquals(29, dfa.getPropertyValue("receiveBufferSize"));
|
||||
assertEquals(30, dfa.getPropertyValue("soReceiveBufferSize"));
|
||||
assertEquals(32, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(true, dfa.getPropertyValue("close"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -163,6 +174,7 @@ public class ParserUnitTests {
|
||||
assertEquals(29, dfa.getPropertyValue("receiveBufferSize"));
|
||||
assertEquals(30, dfa.getPropertyValue("soReceiveBufferSize"));
|
||||
assertEquals(32, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(false, dfa.getPropertyValue("close"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -217,7 +229,6 @@ public class ParserUnitTests {
|
||||
assertEquals(53, dfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(54, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(false, dfa.getPropertyValue("usingDirectBuffers"));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -233,7 +244,6 @@ public class ParserUnitTests {
|
||||
assertEquals(53, dfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(54, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(true, dfa.getPropertyValue("usingDirectBuffers"));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -248,7 +258,6 @@ public class ParserUnitTests {
|
||||
assertEquals(27, dfa.getPropertyValue("soTrafficClass"));
|
||||
assertEquals(53, dfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(54, dfa.getPropertyValue("soTimeout"));
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -267,13 +276,13 @@ public class ParserUnitTests {
|
||||
assertEquals(125, dfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(126, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(23, dfa.getPropertyValue("poolSize"));
|
||||
|
||||
assertEquals(false, dfa.getPropertyValue("close"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOutGateway() {
|
||||
DirectFieldAccessor dfa = new DirectFieldAccessor(simpleTcpNetOutboundGateway);
|
||||
assertTrue(simpleTcpNetOutboundGateway.getPort() >= 6500);
|
||||
assertTrue(simpleTcpNetOutboundGateway.getPort() >= 6600);
|
||||
assertEquals(MessageFormats.FORMAT_CRLF, dfa.getPropertyValue("messageFormat"));
|
||||
TcpNetSendingMessageHandler handler = (TcpNetSendingMessageHandler) dfa
|
||||
.getPropertyValue("handler");
|
||||
@@ -284,6 +293,42 @@ public class ParserUnitTests {
|
||||
assertEquals(224, dfa.getPropertyValue("soReceiveBufferSize"));
|
||||
assertEquals(225, delegateDfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(226, delegateDfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(false, dfa.getPropertyValue("close"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInGatewayClose() {
|
||||
DirectFieldAccessor dfa = new DirectFieldAccessor(simpleTcpNetInboundGatewayClose);
|
||||
assertTrue(simpleTcpNetInboundGatewayClose.getPort() >= 6700);
|
||||
assertEquals(MessageFormats.FORMAT_CRLF, dfa.getPropertyValue("messageFormat"));
|
||||
TcpNetReceivingChannelAdapter delegate = (TcpNetReceivingChannelAdapter) dfa
|
||||
.getPropertyValue("delegate");
|
||||
DirectFieldAccessor delegateDfa = new DirectFieldAccessor(delegate);
|
||||
assertEquals(CustomNetSocketReader.class, delegateDfa.getPropertyValue("customSocketReaderClass"));
|
||||
assertEquals(CustomNetSocketWriter.class, dfa.getPropertyValue("customSocketWriterClass"));
|
||||
assertEquals(true, dfa.getPropertyValue("soKeepAlive"));
|
||||
assertEquals(123, dfa.getPropertyValue("receiveBufferSize"));
|
||||
assertEquals(124, dfa.getPropertyValue("soReceiveBufferSize"));
|
||||
assertEquals(125, dfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(126, dfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(23, dfa.getPropertyValue("poolSize"));
|
||||
assertEquals(true, dfa.getPropertyValue("close"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOutGatewayClose() {
|
||||
DirectFieldAccessor dfa = new DirectFieldAccessor(simpleTcpNetOutboundGatewayClose);
|
||||
assertTrue(simpleTcpNetOutboundGatewayClose.getPort() >= 6800);
|
||||
assertEquals(MessageFormats.FORMAT_CRLF, dfa.getPropertyValue("messageFormat"));
|
||||
TcpNetSendingMessageHandler handler = (TcpNetSendingMessageHandler) dfa
|
||||
.getPropertyValue("handler");
|
||||
DirectFieldAccessor delegateDfa = new DirectFieldAccessor(handler);
|
||||
assertEquals(CustomNetSocketReader.class, dfa.getPropertyValue("customSocketReaderClass"));
|
||||
assertEquals(CustomNetSocketWriter.class, delegateDfa.getPropertyValue("customSocketWriterClass"));
|
||||
assertEquals(true, delegateDfa.getPropertyValue("soKeepAlive"));
|
||||
assertEquals(224, dfa.getPropertyValue("soReceiveBufferSize"));
|
||||
assertEquals(225, delegateDfa.getPropertyValue("soSendBufferSize"));
|
||||
assertEquals(226, delegateDfa.getPropertyValue("soTimeout"));
|
||||
assertEquals(true, dfa.getPropertyValue("close"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,11 +41,14 @@ public class CustomNetSocketReader extends NetSocketReader {
|
||||
* @see org.springframework.integration.ip.tcp.NetSocketReader#assembleDataCustomFormat()
|
||||
*/
|
||||
@Override
|
||||
protected boolean assembleDataCustomFormat() throws IOException {
|
||||
protected int assembleDataCustomFormat() throws IOException {
|
||||
byte[] buff = new byte[24];
|
||||
read(buff);
|
||||
int status = read(buff, true);
|
||||
if (status < 0) {
|
||||
return status;
|
||||
}
|
||||
assembledData = buff;
|
||||
return true;
|
||||
return MESSAGE_COMPLETE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -44,17 +44,17 @@ public class CustomNioSocketReader extends NioSocketReader {
|
||||
* @see org.springframework.integration.ip.tcp.NetSocketReader#assembleDataCustomFormat()
|
||||
*/
|
||||
@Override
|
||||
protected boolean assembleDataCustomFormat() throws IOException {
|
||||
protected int assembleDataCustomFormat() throws IOException {
|
||||
if (buffer == null) {
|
||||
buffer = allocate(24);
|
||||
}
|
||||
readChannel(buffer);
|
||||
if (buffer.hasRemaining()) {
|
||||
return false;
|
||||
return MESSAGE_INCOMPLETE;
|
||||
}
|
||||
assembledData = buffer.array();
|
||||
buffer = null;
|
||||
return true;
|
||||
return MESSAGE_COMPLETE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -45,14 +45,14 @@ public class NetSocketReaderTests {
|
||||
Socket socket = server.accept();
|
||||
socket.setSoTimeout(5000);
|
||||
NetSocketReader reader = new NetSocketReader(socket);
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
}
|
||||
else {
|
||||
fail("Failed to assemble first message");
|
||||
}
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
}
|
||||
@@ -75,14 +75,14 @@ public class NetSocketReaderTests {
|
||||
socket.setSoTimeout(5000);
|
||||
NetSocketReader reader = new NetSocketReader(socket);
|
||||
reader.setMessageFormat(MessageFormats.FORMAT_STX_ETX);
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
}
|
||||
else {
|
||||
fail("Failed to assemble first message");
|
||||
}
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
}
|
||||
@@ -105,14 +105,14 @@ public class NetSocketReaderTests {
|
||||
socket.setSoTimeout(5000);
|
||||
NetSocketReader reader = new NetSocketReader(socket);
|
||||
reader.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
}
|
||||
else {
|
||||
fail("Failed to assemble first message");
|
||||
}
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
}
|
||||
@@ -131,7 +131,7 @@ public class NetSocketReaderTests {
|
||||
socket.setSoTimeout(5000);
|
||||
NetSocketReader reader = new NetSocketReader(socket);
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -153,7 +153,7 @@ public class NetSocketReaderTests {
|
||||
NetSocketReader reader = new NetSocketReader(socket);
|
||||
reader.setMessageFormat(MessageFormats.FORMAT_STX_ETX);
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -176,7 +176,7 @@ public class NetSocketReaderTests {
|
||||
reader.setMessageFormat(MessageFormats.FORMAT_STX_ETX);
|
||||
reader.setMaxMessageSize(1024);
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -198,7 +198,7 @@ public class NetSocketReaderTests {
|
||||
NetSocketReader reader = new NetSocketReader(socket);
|
||||
reader.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -221,7 +221,7 @@ public class NetSocketReaderTests {
|
||||
reader.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
reader.setMaxMessageSize(1024);
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
@@ -82,7 +82,7 @@ public class NioSocketReaderTests {
|
||||
iterator.remove();
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
count++;
|
||||
@@ -138,7 +138,7 @@ public class NioSocketReaderTests {
|
||||
iterator.remove();
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", "xx",
|
||||
new String(reader.getAssembledData()));
|
||||
done = true;
|
||||
@@ -198,7 +198,7 @@ public class NioSocketReaderTests {
|
||||
iterator.remove();
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
count++;
|
||||
@@ -258,7 +258,7 @@ public class NioSocketReaderTests {
|
||||
iterator.remove();
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
assertEquals("Data", SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String(reader.getAssembledData()));
|
||||
count++;
|
||||
@@ -318,7 +318,7 @@ public class NioSocketReaderTests {
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -387,7 +387,7 @@ public class NioSocketReaderTests {
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -456,7 +456,7 @@ public class NioSocketReaderTests {
|
||||
if (key.isReadable()) {
|
||||
assertEquals(channel, key.channel());
|
||||
try {
|
||||
if (reader.assembleData()) {
|
||||
if (reader.assembleData() == SocketReader.MESSAGE_COMPLETE) {
|
||||
fail("Expected message length exceeded exception");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
|
||||
@@ -134,9 +134,9 @@ public class SimpleTcpNetInboundGatewayTests {
|
||||
startup = 0;
|
||||
Socket socket = SocketFactory.getDefault().createSocket("localhost", gatewayCustom.getPort());
|
||||
String greetings = "Hello World!";
|
||||
String pad = " ";
|
||||
String pad = " ";
|
||||
socket.getOutputStream().write((greetings).getBytes());
|
||||
socket.getOutputStream().write(pad.getBytes()); // will be truncated
|
||||
socket.getOutputStream().write(pad.getBytes());
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int c;
|
||||
int n = 0;
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package org.springframework.integration.ip.tcp;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
@@ -22,7 +24,6 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.net.ServerSocketFactory;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -35,8 +36,6 @@ import org.springframework.integration.message.MessageBuilder;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Gary Russell
|
||||
*
|
||||
@@ -74,16 +73,29 @@ public class SimpleTcpNetOutboundGatewayTests {
|
||||
SimpleTcpNetOutboundGateway gateway = new SimpleTcpNetOutboundGateway
|
||||
("localhost", inboundGatewayCrLf.getPort());
|
||||
gateway.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
waitListening(inboundGatewayCrLf);
|
||||
Message<String> message = MessageBuilder.withPayload("test").build();
|
||||
byte[] bytes = (byte[]) gateway.handleRequestMessage(message);
|
||||
assertEquals("echo:test", new String(bytes));
|
||||
}
|
||||
|
||||
private void waitListening(SimpleTcpNetInboundGateway gateway) throws Exception {
|
||||
int n = 0;
|
||||
while (!gateway.isListening()) {
|
||||
Thread.sleep(100);
|
||||
if (n++ > 100) {
|
||||
throw new Exception("Gateway failed to listen");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOutboundStxEtx() throws Exception {
|
||||
SimpleTcpNetOutboundGateway gateway = new SimpleTcpNetOutboundGateway
|
||||
("localhost", inboundGatewayStxEtx.getPort());
|
||||
gateway.setMessageFormat(MessageFormats.FORMAT_STX_ETX);
|
||||
waitListening(inboundGatewayStxEtx);
|
||||
Message<String> message = MessageBuilder.withPayload("test").build();
|
||||
byte[] bytes = (byte[]) gateway.handleRequestMessage(message);
|
||||
assertEquals("echo:test", new String(bytes));
|
||||
@@ -94,6 +106,7 @@ public class SimpleTcpNetOutboundGatewayTests {
|
||||
SimpleTcpNetOutboundGateway gateway = new SimpleTcpNetOutboundGateway
|
||||
("localhost", inboundGatewayLength.getPort());
|
||||
gateway.setMessageFormat(MessageFormats.FORMAT_LENGTH_HEADER);
|
||||
waitListening(inboundGatewayLength);
|
||||
Message<String> message = MessageBuilder.withPayload("test").build();
|
||||
byte[] bytes = (byte[]) gateway.handleRequestMessage(message);
|
||||
assertEquals("echo:test", new String(bytes));
|
||||
@@ -106,6 +119,7 @@ public class SimpleTcpNetOutboundGatewayTests {
|
||||
gateway.setMessageFormat(MessageFormats.FORMAT_CUSTOM);
|
||||
gateway.setCustomSocketReaderClassName("org.springframework.integration.ip.tcp.CustomNetSocketReader");
|
||||
gateway.setCustomSocketWriterClassName("org.springframework.integration.ip.tcp.CustomNetSocketWriter");
|
||||
waitListening(inboundGatewayCustom);
|
||||
Message<String> message = MessageBuilder.withPayload("test").build();
|
||||
byte[] bytes = (byte[]) gateway.handleRequestMessage(message);
|
||||
assertEquals("echo:test", new String(bytes).trim());
|
||||
@@ -119,11 +133,12 @@ public class SimpleTcpNetOutboundGatewayTests {
|
||||
assertEquals("echo:test", new String(bytes).trim());
|
||||
}
|
||||
|
||||
@Ignore @Test
|
||||
@Test
|
||||
public void testOutboundClose() throws Exception {
|
||||
final int port = SocketUtils.findAvailableServerSocket();
|
||||
final CountDownLatch latch1 = new CountDownLatch(1);
|
||||
final CountDownLatch latch2 = new CountDownLatch(1);
|
||||
final CountDownLatch latch3 = new CountDownLatch(1);
|
||||
Thread t = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
@@ -134,8 +149,9 @@ public class SimpleTcpNetOutboundGatewayTests {
|
||||
byte[] b = new byte[1024];
|
||||
s.getInputStream().read(b);
|
||||
s.getOutputStream().write("OK\r\n".getBytes());
|
||||
s.close();
|
||||
latch2.countDown();
|
||||
latch3.await();
|
||||
s.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@@ -146,9 +162,11 @@ public class SimpleTcpNetOutboundGatewayTests {
|
||||
SimpleTcpNetOutboundGateway gateway = new SimpleTcpNetOutboundGateway
|
||||
("localhost", port);
|
||||
gateway.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
gateway.setClose(true);
|
||||
Message<String> message = MessageBuilder.withPayload("test").build();
|
||||
byte[] bytes = (byte[]) gateway.handleRequestMessage(message);
|
||||
assertEquals("OK", new String(bytes));
|
||||
latch3.countDown();
|
||||
latch2.await(2000, TimeUnit.MILLISECONDS);
|
||||
bytes = (byte[]) gateway.handleRequestMessage(message);
|
||||
assertEquals("OK", new String(bytes));
|
||||
|
||||
@@ -91,8 +91,8 @@ public class SocketMessageMapperTests {
|
||||
/* (non-Javadoc)
|
||||
* @see org.springframework.integration.ip.tcp.SocketReader#assembleData()
|
||||
*/
|
||||
public boolean assembleData() {
|
||||
return false;
|
||||
public int assembleData() {
|
||||
return SocketReader.MESSAGE_INCOMPLETE;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
||||
@@ -18,6 +18,8 @@ package org.springframework.integration.ip.tcp;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.core.Message;
|
||||
@@ -44,14 +46,13 @@ public class TcpReceivingChannelAdapterTests {
|
||||
taskScheduler.initialize();
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
Thread.sleep(2000); // wait for server to start listening
|
||||
waitListening(adapter);
|
||||
SocketUtils.testSendLength(port, null); //sends 2 copies of TEST_STRING twice
|
||||
Thread.sleep(2000); // wait for asynch processing
|
||||
Message<?> message = channel.receive(0);
|
||||
Message<?> message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
message = channel.receive(0);
|
||||
message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
@@ -74,14 +75,13 @@ public class TcpReceivingChannelAdapterTests {
|
||||
taskScheduler.initialize();
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
Thread.sleep(2000); // wait for server to start listening
|
||||
waitListening(adapter);
|
||||
SocketUtils.testSendStxEtx(port, null); //sends 2 copies of TEST_STRING twice
|
||||
Thread.sleep(4000); // wait for asynch processing
|
||||
Message<?> message = channel.receive(0);
|
||||
Message<?> message = channel.receive(4000);
|
||||
assertNotNull(message);
|
||||
assertEquals("\u0002" + SocketUtils.TEST_STRING + SocketUtils.TEST_STRING + "\u0003",
|
||||
new String((byte[])message.getPayload()));
|
||||
message = channel.receive(0);
|
||||
message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals("\u0002" + SocketUtils.TEST_STRING + SocketUtils.TEST_STRING + "\u0003",
|
||||
new String((byte[])message.getPayload()));
|
||||
@@ -102,14 +102,13 @@ public class TcpReceivingChannelAdapterTests {
|
||||
taskScheduler.initialize();
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
Thread.sleep(2000); // wait for server to start listening
|
||||
waitListening(adapter);
|
||||
SocketUtils.testSendLength(port, null); //sends 2 copies of TEST_STRING twice
|
||||
Thread.sleep(2000); // wait for asynch processing
|
||||
Message<?> message = channel.receive(0);
|
||||
Message<?> message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
message = channel.receive(0);
|
||||
message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
@@ -131,18 +130,98 @@ public class TcpReceivingChannelAdapterTests {
|
||||
taskScheduler.initialize();
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
Thread.sleep(2000); // wait for server to start listening
|
||||
waitListening(adapter);
|
||||
SocketUtils.testSendStxEtx(port, null); //sends 2 copies of TEST_STRING twice
|
||||
Thread.sleep(4000); // wait for asynch processing
|
||||
Message<?> message = channel.receive(0);
|
||||
Message<?> message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals("\u0002" + SocketUtils.TEST_STRING + SocketUtils.TEST_STRING + "\u0003",
|
||||
new String((byte[])message.getPayload()));
|
||||
message = channel.receive(0);
|
||||
message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals("\u0002" + SocketUtils.TEST_STRING + SocketUtils.TEST_STRING + "\u0003",
|
||||
new String((byte[])message.getPayload()));
|
||||
adapter.stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests close option on inbound adapter.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void testNetClose() throws Exception {
|
||||
QueueChannel channel = new QueueChannel(2);
|
||||
int port = SocketUtils.findAvailableServerSocket();
|
||||
AbstractTcpReceivingChannelAdapter adapter = new TcpNetReceivingChannelAdapter(port);
|
||||
adapter.setOutputChannel(channel);
|
||||
adapter.setClose(true);
|
||||
adapter.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
|
||||
taskScheduler.initialize();
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
waitListening(adapter);
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
SocketUtils.testSendCrLfSingle(port, latch);
|
||||
Message<?> message = channel.receive(5000);
|
||||
latch.countDown();
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
latch = new CountDownLatch(1);
|
||||
SocketUtils.testSendCrLfSingle(port, latch);
|
||||
message = channel.receive(5000);
|
||||
latch.countDown();
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
adapter.stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests close option on inbound adapter.
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void testNioClose() throws Exception {
|
||||
QueueChannel channel = new QueueChannel(2);
|
||||
int port = SocketUtils.findAvailableServerSocket();
|
||||
AbstractTcpReceivingChannelAdapter adapter = new TcpNioReceivingChannelAdapter(port);
|
||||
adapter.setOutputChannel(channel);
|
||||
adapter.setClose(true);
|
||||
adapter.setMessageFormat(MessageFormats.FORMAT_CRLF);
|
||||
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
|
||||
taskScheduler.initialize();
|
||||
adapter.setTaskScheduler(taskScheduler);
|
||||
adapter.start();
|
||||
waitListening(adapter);
|
||||
CountDownLatch latch = new CountDownLatch(1);
|
||||
SocketUtils.testSendCrLfSingle(port, latch);
|
||||
Message<?> message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
latch = new CountDownLatch(1);
|
||||
SocketUtils.testSendCrLfSingle(port, latch);
|
||||
message = channel.receive(2000);
|
||||
assertNotNull(message);
|
||||
assertEquals(SocketUtils.TEST_STRING + SocketUtils.TEST_STRING,
|
||||
new String((byte[])message.getPayload()));
|
||||
adapter.stop();
|
||||
}
|
||||
|
||||
private void waitListening(AbstractInternetProtocolReceivingChannelAdapter adapter) throws Exception {
|
||||
int n = 0;
|
||||
while (!adapter.isListening()) {
|
||||
Thread.sleep(100);
|
||||
if (n++ > 100) {
|
||||
throw new Exception("Gateway failed to listen");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -222,7 +222,34 @@ public class SocketUtils {
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sends a single message +CRLF.
|
||||
* @param latch Waits for latch to count down before closing the socket.
|
||||
*/
|
||||
public static void testSendCrLfSingle(final int port, final CountDownLatch latch) {
|
||||
Thread thread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
Socket socket = new Socket(InetAddress.getByName("localhost"), port);
|
||||
OutputStream outputStream = socket.getOutputStream();
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
outputStream.write(TEST_STRING.getBytes());
|
||||
writeByte(outputStream, '\r', true);
|
||||
writeByte(outputStream, '\n', true);
|
||||
if (latch != null) {
|
||||
latch.await();
|
||||
}
|
||||
socket.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a large CRLF message with no CRLF.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user