You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by cw...@apache.org on 2018/12/13 16:32:14 UTC
svn commit: r1848866 - in /uima/uima-ducc/trunk/uima-ducc-pullservice/src:
main/java/org/apache/uima/ducc/ps/service/transport/http/HttpServiceTransport.java
test/java/org/apache/uima/ducc/ps/transport/JunitTransportTestCase.java
Author: cwiklik
Date: Thu Dec 13 16:32:14 2018
New Revision: 1848866
URL: http://svn.apache.org/viewvc?rev=1848866&view=rev
Log:
UIMA-5933 Simplified error handling caught when calling HttpClient.execute(). Added new JUnit tests to test 3 new scenarios: 1) IOException 2) NoRouteToHostException 3) URILSyntaxException
Modified:
uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/transport/http/HttpServiceTransport.java
uima/uima-ducc/trunk/uima-ducc-pullservice/src/test/java/org/apache/uima/ducc/ps/transport/JunitTransportTestCase.java
Modified: uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/transport/http/HttpServiceTransport.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/transport/http/HttpServiceTransport.java?rev=1848866&r1=1848865&r2=1848866&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/transport/http/HttpServiceTransport.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-pullservice/src/main/java/org/apache/uima/ducc/ps/service/transport/http/HttpServiceTransport.java Thu Dec 13 16:32:14 2018
@@ -20,7 +20,9 @@ package org.apache.uima.ducc.ps.service.
import java.io.IOException;
import java.lang.management.ManagementFactory;
+import java.net.ConnectException;
import java.net.InetAddress;
+import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.URI;
import java.net.URISyntaxException;
@@ -29,6 +31,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;
+import org.apache.commons.httpclient.URIException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
@@ -241,7 +244,7 @@ public class HttpServiceTransport implem
return response;
}
- private String doPost(HttpPost postMethod) throws URISyntaxException, NoHttpResponseException, IOException, TransportException {
+ private String doPost(HttpPost postMethod) throws URISyntaxException, IOException, TransportException {
postMethod.setURI(new URI(currentTargetUrl.asString()));
HttpResponse response = httpClient.execute(postMethod);
@@ -251,12 +254,10 @@ public class HttpServiceTransport implem
HttpEntity entity = response.getEntity();
String serializedResponse = EntityUtils.toString(entity);
StatusLine statusLine = response.getStatusLine();
- if (statusLine.getStatusCode() != 200 && logger.isLoggable(Level.WARNING) ) {
-
- logger.log(Level.WARNING,"execute", "Unable to Communicate with client - Error:"+statusLine);
- logger.log(Level.WARNING, "Content causing error:"+serializedResponse);
- throw new TransportException(
- "Http Client Unable to Communicate with a remote client - Error:" + statusLine);
+ if (statusLine.getStatusCode() != 200 ) {
+ // all IOExceptions are retried
+ throw new IOException(
+ "Unexpected HttpClient response status:"+statusLine+ " Content causing error:"+serializedResponse);
}
stats.incrementSuccessCount();
@@ -277,61 +278,45 @@ public class HttpServiceTransport implem
postMethod.setEntity(e);
String serializedResponse = null;
try {
- serializedResponse = doPost(postMethod);
+ String simulatedException;
+ // To test transport errors add command line option -DMockHttpPostError=exception where
+ // exception is one of the following Strings:
+ //
+ // IOException,
+ // SocketException,
+ // UnknownHostException,
+ // NoRouteToHostException,
+ // NoHttpResponseException,
+ // HttpHostConnectException,
+ // URISyntaxException
- } catch ( NoHttpResponseException ex ) {
- if ( stopping ) {
- System.out.println("Process Thread:"+Thread.currentThread().getId()+" NoHttpResponseException ");
- throw new TransportException(ex);
+ if ( ( simulatedException = System.getProperty("MockHttpPostError")) != null ) {
+ HttpClientExceptionGenerator mockExceptionGenerator =
+ new HttpClientExceptionGenerator(simulatedException);
+ mockExceptionGenerator.throwSimulatedException();
} else {
- serializedResponse = retryUntilSuccessfull(serializedRequest, postMethod);
+ serializedResponse = doPost(postMethod);
}
-
- } catch (HttpHostConnectException | UnknownHostException ex ) {
+ } catch( IOException | URISyntaxException ex) {
if ( stopping ) {
- System.out.println(this.getClass().getName()+".dispatch() Process Thread:"+Thread.currentThread().getId()+" HttpHostConnectException ");
-
+ // looks like the process is in the shutdown mode. Log an exception and dont retry
+ logger.log(Level.INFO,"Process Thread:"+Thread.currentThread().getId()+" - Process is already stopping - Caught Exception while calling doPost() \n"+ex);
throw new TransportException(ex);
+ } else {
+ if ( log ) {
+ log = false;
+ stats.incrementErrorCount();
+ logger.log(Level.WARNING, this.getClass().getName()+".dispatch() >>>>>>>>>> Handling Exception \n"+ex);
+// System.out.println( this.getClass().getName()+".dispatch() >>>>>>>>>> Unable to communicate with target:"+currentTargetUrl.asString()+" - retrying until successfull - with "+threadSleepTime/1000+" seconds wait between retries ");
+ logger.log(Level.INFO, ">>>>>>>>>> Unable to communicate with target:"+currentTargetUrl.asString()+" - retrying until successfull - with "+threadSleepTime/1000+" seconds wait between retries ");
+ }
+ serializedResponse = retryUntilSuccessfull(serializedRequest, postMethod);
+ log = true;
+ logger.log(Level.INFO, "Established connection to target:"+currentTargetUrl.asString());
}
- stats.incrementErrorCount();
- Action action = handleConnectionError(ex);
- if ( Action.CONTINUE.equals(action)) {
- try {
- // Lost connection to the Task Allocation App
- // Block until connection is restored
- if ( log ) {
- log = false;
- System.out.println( this.getClass().getName()+".dispatch() >>>>>>>>>> Unable to connect to target:"+currentTargetUrl.asString()+" - retrying until successfull - with "+threadSleepTime/1000+" seconds wait between retries ");
- logger.log(Level.INFO, ">>>>>>>>>> Unable to connect to target:"+currentTargetUrl.asString()+" - retrying until successfull - with "+threadSleepTime/1000+" seconds wait between retries ");
- }
- serializedResponse = retryUntilSuccessfull(serializedRequest, postMethod);
- log = true;
- logger.log(Level.INFO, "Established connection to target:"+currentTargetUrl.asString());
-
- } catch( Exception ee) {
- log = true;
- // Fail here - bad URI
- }
-
-
- } else if ( Action.TERMINATE.equals(action)) {
- ex.printStackTrace();
- }
-
- } catch (SocketException ex) {
- if ( stopping ) {
- throw new TransportException(ex);
- }
-
- } catch (TransportException ex) {
-
- } catch (Exception ex) {
- ex.printStackTrace();
- throw new TransportException(ex);
- }
- finally {
+ } finally {
postMethod.releaseConnection();
}
return serializedResponse;
@@ -371,6 +356,53 @@ public class HttpServiceTransport implem
}
-
+ public static class HttpClientExceptionGenerator {
+ public enum ERROR{ IOException, SocketException, UnknownHostException, NoRouteToHostException,NoHttpResponseException, HttpHostConnectException, URISyntaxException};
+
+ Exception exceptionClass;
+
+ public HttpClientExceptionGenerator(String exc) {
+ for( ERROR e : ERROR.values()) {
+ if ( exc != null && e.name().equals(exc)) {
+ switch(e) {
+ case IOException:
+ exceptionClass = new IOException("Simulated IOException");
+ break;
+ case URISyntaxException:
+ exceptionClass = new URISyntaxException("", "Simulated URISyntaxException");
+ break;
+ case NoRouteToHostException:
+ exceptionClass = new NoRouteToHostException("Simulated NoRouteToHostException");
+ break;
+ case NoHttpResponseException:
+ exceptionClass = new NoHttpResponseException("Simulated NoHttpResponseException");
+ break;
+ case SocketException:
+ exceptionClass = new SocketException("Simulated SocketException");
+ break;
+ case UnknownHostException:
+ exceptionClass = new UnknownHostException("Simulated UnknownHostException");
+ break;
+
+ default:
+
+
+ }
+ }
+ }
+ }
+ public void throwSimulatedException() throws IOException, URISyntaxException {
+ if ( exceptionClass != null ) {
+ if ( exceptionClass instanceof IOException ) {
+ throw (IOException)exceptionClass;
+ } else if ( exceptionClass instanceof URISyntaxException ) {
+ throw (URISyntaxException)exceptionClass;
+ }
+
+ }
+ }
+
+
+ }
}
Modified: uima/uima-ducc/trunk/uima-ducc-pullservice/src/test/java/org/apache/uima/ducc/ps/transport/JunitTransportTestCase.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-pullservice/src/test/java/org/apache/uima/ducc/ps/transport/JunitTransportTestCase.java?rev=1848866&r1=1848865&r2=1848866&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-pullservice/src/test/java/org/apache/uima/ducc/ps/transport/JunitTransportTestCase.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-pullservice/src/test/java/org/apache/uima/ducc/ps/transport/JunitTransportTestCase.java Thu Dec 13 16:32:14 2018
@@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRes
import org.apache.uima.ducc.ps.service.registry.DefaultRegistryClient;
import org.apache.uima.ducc.ps.service.transport.ITargetURI;
import org.apache.uima.ducc.ps.service.transport.http.HttpServiceTransport;
+import org.apache.uima.ducc.ps.service.transport.http.HttpServiceTransport.HttpClientExceptionGenerator.ERROR;
import org.apache.uima.ducc.ps.service.transport.target.HttpTargetURI;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
@@ -91,7 +92,14 @@ public class JunitTransportTestCase {
}
System.out.println("Jetty Stopped");
}
-
+ private void wait(DefaultRegistryClient registryClient) {
+ synchronized(registryClient) {
+ try {
+ registryClient.wait(5*1000);
+
+ } catch( InterruptedException e) {}
+ }
+ }
@Test
public void testTransportBasicConnectivity() throws Exception
{
@@ -106,6 +114,51 @@ public class JunitTransportTestCase {
// assertThat("Response Code", http.getResponseCode(), (equal((HttpStatus.OK_200)));
}
+ @Test
+ public void testTransportIOException() throws Exception
+ {
+ System.out.println(".... Test::testTransportIOException");
+ int scaleout = 12;
+ ITargetURI targetUrl = new HttpTargetURI("http://localhost:"+httpPort+"/"+app);
+ DefaultRegistryClient registryClient =
+ new DefaultRegistryClient(targetUrl);
+ HttpServiceTransport transport = new HttpServiceTransport(registryClient, scaleout);
+ transport.initialize();
+ System.setProperty("MockHttpPostError", ERROR.IOException.name());
+ transport.dispatch("Dummy Message");
+
+ wait(registryClient);
+ }
+ @Test
+ public void testTransportNoRoutToHostException() throws Exception
+ {
+ System.out.println(".... Test::testTransportNoRoutToHostException");
+ int scaleout = 12;
+ ITargetURI targetUrl = new HttpTargetURI("http://localhost:"+httpPort+"/"+app);
+ DefaultRegistryClient registryClient =
+ new DefaultRegistryClient(targetUrl);
+ HttpServiceTransport transport = new HttpServiceTransport(registryClient, scaleout);
+ transport.initialize();
+ System.setProperty("MockHttpPostError", ERROR.NoRouteToHostException.name());
+ transport.dispatch("Dummy Message");
+ wait(registryClient);
+
+ }
+ @Test
+ public void testTransportURISyntaxException() throws Exception
+ {
+ System.out.println(".... Test::testTransportURISyntaxException");
+ int scaleout = 12;
+ ITargetURI targetUrl = new HttpTargetURI("http://localhost:"+httpPort+"/"+app);
+ DefaultRegistryClient registryClient =
+ new DefaultRegistryClient(targetUrl);
+ HttpServiceTransport transport = new HttpServiceTransport(registryClient, scaleout);
+ transport.initialize();
+ System.setProperty("MockHttpPostError", ERROR.URISyntaxException.name());
+ transport.dispatch("Dummy Message");
+ wait(registryClient);
+
+ }
public class TaskHandlerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;