diff --git a/docs/src/reference/docbook/ip.xml b/docs/src/reference/docbook/ip.xml index b7f357fef9..369bbcd980 100644 --- a/docs/src/reference/docbook/ip.xml +++ b/docs/src/reference/docbook/ip.xml @@ -486,7 +486,19 @@ from the response message by writing it to the connection. - The outbound gateway, after sending a message over the connection, waits for a response and + + + For the inbound gateway, care must be taken to retain, or populate, the + ip_connnection_id header because it is used to + correlate the message to a connection. Messages that originate at the + gateway will automatically have the header set. If the reply is + constructed as a new message, you will need to set the header. The + header value can be captured from the incoming message. + + + + + The outbound gateway, after sending a message over the connection, waits for a response and constructs a response message and puts in on the reply channel. Communications over the connections are single-threaded. Users should be aware that only one message can be handled at a time and, if another thread attempts to send @@ -562,12 +574,30 @@ To achieve high-volume throughput (avoiding the pitfalls of using gateways as mentioned above) you may consider configuring a pair of collaborating - outbound and inbound channel adapters. On the server side, message + outbound and inbound channel adapters. + Collaborating adapters can also be used (server-side or client-side) for + totally asynchronous communication (rather than with request/reply semantics). + On the server side, message correlation is automatically handled by the adapters because the inbound adapter adds a header allowing the outbound adapter to determine which - connection to use to send the reply message. On the client side, however, - the application will have to provide its own correlation logic. This can - be done in a number of ways. + connection to use to send the reply message. + + + + + On the server side, care must be taken to populate the + ip_connnection_id header because it is used to + correlate the message to a connection. Messages that originate at the + inbound adapter will automatically have the header set. If you wish to + construct other messages to send, you will need to set the header. The + header value can be captured from an incoming message. + + + + + On the client side, + the application will have to provide its own correlation logic, if needed. + This can be done in a number of ways. If the message payload has some natural correlation data, such as a diff --git a/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpInboundGateway.java b/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpInboundGateway.java index 9c74b8113d..8cf4d50b99 100644 --- a/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpInboundGateway.java +++ b/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpInboundGateway.java @@ -53,9 +53,12 @@ public class TcpInboundGateway extends MessagingGatewaySupport implements TcpLis return false; } String connectionId = (String) message.getHeaders().get(IpHeaders.CONNECTION_ID); - TcpConnection connection = connections.get(connectionId); + TcpConnection connection = null; + if (connectionId != null) { + connection = connections.get(connectionId); + } if (connection == null) { - logger.error("Connection " + connectionId + " not found when processing reply for " + message); + logger.error("Connection not found when processing reply " + reply + " for " + message); return false; } try { diff --git a/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpSendingMessageHandler.java b/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpSendingMessageHandler.java index 83dd53b3b7..1370e92ed8 100644 --- a/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpSendingMessageHandler.java +++ b/spring-integration-ip/src/main/java/org/springframework/integration/ip/tcp/TcpSendingMessageHandler.java @@ -81,7 +81,10 @@ public class TcpSendingMessageHandler extends AbstractMessageHandler implements if (this.serverConnectionFactory != null) { // We don't own the connection, we are asynchronously replying Object connectionId = message.getHeaders().get(IpHeaders.CONNECTION_ID); - TcpConnection connection = connections.get(connectionId); + TcpConnection connection = null; + if (connectionId != null) { + connection = connections.get(connectionId); + } if (connection != null) { try { connection.send(message); @@ -90,7 +93,7 @@ public class TcpSendingMessageHandler extends AbstractMessageHandler implements connection.close(); } } else { - logger.error("Unable to find incoming socket for " + message); + logger.error("Unable to find outbound socket for " + message); } return; }