I am writing an HTTP client that posts a file to a service using Restlet 2.4.0. The POST works, but after 60 seconds the client throws an exception:
Exception: class org.restlet.resource.ResourceException : Communication Error (1001) - The connector failed to complete the communication with the server
The server properly processes the data, and takes about 200 seconds, despite the client timing out.
I want instead for the client to wait for the data to be processed. I also want to know that the operation actually completed successfully so if it fails it can be re-tried.
What changes are needed on the client so that it does not time out prematurely?
Test Code:
package edu.umro.RestletUtil;
import org.restlet.Context;
import org.restlet.data.ChallengeResponse;
import org.restlet.data.ChallengeScheme;
import org.restlet.data.MediaType;
import org.restlet.ext.html.FormData;
import org.restlet.ext.html.FormDataSet;
import org.restlet.representation.FileRepresentation;
import org.restlet.resource.ClientResource;
import java.io.File;
/**
* Test HTTP POST using Restlet version 2.4.0
*/
public class Poster {
public static void main(String[] args) {
System.out.println("Starting ...");
String userId = "myId";
String password = "somePassword";
String url = "https://localhost/run/BBbyCBCT_1?Run=Run&AutoUpload=true";
File file = new File("C:\\tmp\\29BR_cbct.zip");
ChallengeResponse challengeResponse = new ChallengeResponse(ChallengeScheme.HTTP_BASIC, userId, password);
Context clientContext = new Context();
clientContext.getAttributes().put("sslContextFactory", new TrustingSslContextFactory());
ClientResource clientResource = new ClientResource(clientContext, url);
clientResource.setChallengeResponse(challengeResponse);
FileRepresentation entity = new FileRepresentation(file, MediaType.APPLICATION_ZIP);
FormDataSet formDataSet = new FormDataSet();
formDataSet.getEntries().add(new FormData("FileTag", entity));
formDataSet.setMultipart(true);
long start = System.currentTimeMillis();
try {
clientResource.post(formDataSet, MediaType.MULTIPART_FORM_DATA);
System.out.println("Yay, it worked!!!!!!!!");
} catch (Exception ex) {
System.out.println("Failure :(");
System.out.println("Exception: " + ex.getClass() + " : " + ex.getMessage());
ex.printStackTrace();
}
long elapsed = System.currentTimeMillis() - start;
System.out.println("Done. Elapsed time of POST in ms: " + elapsed);
System.out.println("Exiting.");
System.exit(0);
}
}
Output:
Starting ...
Starting the Apache HTTP client
An error occurred during the communication with the remote HTTP server.
java.net.SocketTimeoutException: Read timed out
at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1461)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1065)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:273)
at org.apache.http.impl.conn.LoggingSessionInputBuffer.readLine(LoggingSessionInputBuffer.java:116)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:223)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:682)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339)
at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105)
at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119)
at org.restlet.Client.handle(Client.java:153)
at org.restlet.routing.Filter.doHandle(Filter.java:150)
at org.restlet.routing.Filter.handle(Filter.java:197)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1122)
at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1208)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1077)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1095)
at org.restlet.resource.ClientResource.post(ClientResource.java:1498)
at edu.umro.RestletUtil.Poster.main(Poster.java:41)
org.restlet.resource.ResourceException: Communication Error (1001) - The connector failed to complete the communication with the server
at org.restlet.resource.ClientResource.doError(ClientResource.java:621)
at org.restlet.resource.ClientResource.doError(ClientResource.java:606)
at org.restlet.resource.ClientResource.handleInbound(ClientResource.java:1185)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1078)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1095)
at org.restlet.resource.ClientResource.post(ClientResource.java:1498)
at edu.umro.RestletUtil.Poster.main(Poster.java:41)
Caused by: java.net.SocketTimeoutException: Read timed out
at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
at java.base/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
at java.base/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1461)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1065)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:160)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:84)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:273)
at org.apache.http.impl.conn.LoggingSessionInputBuffer.readLine(LoggingSessionInputBuffer.java:116)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:223)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:682)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at org.restlet.ext.httpclient.internal.HttpMethodCall.sendRequest(HttpMethodCall.java:339)
at org.restlet.engine.adapter.ClientAdapter.commit(ClientAdapter.java:105)
at org.restlet.engine.adapter.HttpClientHelper.handle(HttpClientHelper.java:119)
at org.restlet.Client.handle(Client.java:153)
at org.restlet.routing.Filter.doHandle(Filter.java:150)
at org.restlet.routing.Filter.handle(Filter.java:197)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1122)
at org.restlet.resource.ClientResource.handleOutbound(ClientResource.java:1208)
at org.restlet.resource.ClientResource.handle(ClientResource.java:1077)
... 3 more
Failure :(
Exception: class org.restlet.resource.ResourceException : Communication Error (1001) - The connector failed to complete the communication with the server
Done. Elapsed time of POST in ms: 60978
Exiting.
Process finished with exit code 0