TCP: Clarify Async Exception Handling

This commit is contained in:
Gary Russell
2015-11-04 11:28:44 -05:00
parent d220665bc7
commit d10509ca37
3 changed files with 31 additions and 9 deletions

View File

@@ -26,7 +26,7 @@ on the socket.
This sample now shows how to use the `group-timeout` on the aggregator to release the group under this condition.
Further, it routes the discarded message to a service activator which return a `MessagingTimeoutException` which
is routed to the waiting thread.
is routed to the waiting thread and thrown to the caller.
````
gateway -> outbound-channel-adapter
@@ -38,6 +38,12 @@ aggregator(group-timeout discard)->service-activator
A service activator is used here instead of a transformer because you may wish to take some other action when the
timeout condition occurs.
Normal gateway processing detects that the payload is an `Exception` and throws it to the caller.
There are two test cases, one throws an exception; the other returns one as the message payload.
Thus, this shows how to return an exception to a gateway caller, even when the messaging is entirely asynchronous.
When the payload of the reply messsage is a `Throwable` normal gateway processing detects that and throws it to the
caller.
Similarly, when the async flow throws an exception, it is wrapped in an `ErrorMessage` and routed to the caller.
Thus, this shows both techniques for returning an exception to a gateway caller, even when the messaging is entirely
asynchronous.

View File

@@ -31,7 +31,7 @@ public class EchoService {
if ("FAIL".equals(input)) {
throw new RuntimeException("Failure Demonstration");
}
else if("TIMEOUT_TEST".equals(input)){
else if(input.startsWith("TIMEOUT_TEST")) {
Thread.sleep(3000);
}
@@ -39,7 +39,12 @@ public class EchoService {
}
public MessageTimeoutException noResponse(String input) {
return new MessageTimeoutException("No response received for " + input);
if ("TIMEOUT_TEST_THROW".equals(input)) {
throw new MessageTimeoutException("No response received for " + input);
}
else {
return new MessageTimeoutException("No response received for " + input);
}
}
}

View File

@@ -33,10 +33,10 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.integration.MessageTimeoutException;
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
import org.springframework.integration.ip.util.TestingUtilities;
import org.springframework.integration.samples.tcpclientserver.support.CustomTestContextLoader;
import org.springframework.messaging.MessagingException;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -97,12 +97,23 @@ public class TcpClientServerDemoTest {
}
@Test
public void testTimeout() {
public void testTimeoutThrow() {
try {
gw.send("TIMEOUT_TEST");
gw.send("TIMEOUT_TEST_THROW");
fail("expected exception");
}
catch (MessageTimeoutException e) {
catch (MessagingException e) {
assertThat(e.getMessage(), containsString("No response received for TIMEOUT_TEST"));
}
}
@Test
public void testTimeoutReturn() {
try {
gw.send("TIMEOUT_TEST_RETURN");
fail("expected exception");
}
catch (MessagingException e) {
assertThat(e.getMessage(), containsString("No response received for TIMEOUT_TEST"));
}
}