Skip to content

Instantly share code, notes, and snippets.

@timbrown5
Created April 7, 2014 09:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timbrown5/ec4add8797fbf4d9cd19 to your computer and use it in GitHub Desktop.
Save timbrown5/ec4add8797fbf4d9cd19 to your computer and use it in GitHub Desktop.
Retry HTTP call on connection failure in sendHTTPReponse()
.
..
...
public JSONObject sendHTTPCall(String urlString, String requestType, AbstractBuild build, BuildListener listener)
throws IOException {
return sendHTTPCall( urlString, requestType, build, listener, 1 );
}
public JSONObject sendHTTPCall(String urlString, String requestType, AbstractBuild build, BuildListener listener, int NumberOfAttempts)
throws IOException {
RemoteJenkinsServer remoteServer = this.findRemoteHost(this.getRemoteJenkinsName());
if (remoteServer == null) {
this.failBuild(new Exception("No remote host is defined for this job."), listener);
return null;
}
HttpURLConnection connection = null;
JSONObject responseObject = null;
try {
URL buildUrl = new URL(urlString);
connection = (HttpURLConnection) buildUrl.openConnection();
// if there is a username + apiToken defined for this remote host, then use it
String usernameTokenConcat;
if (this.getOverrideAuth()) {
usernameTokenConcat = this.getAuth()[0].getUsername() + ":" + this.getAuth()[0].getPassword();
} else {
usernameTokenConcat = remoteServer.getAuth()[0].getUsername() + ":"
+ remoteServer.getAuth()[0].getPassword();
}
if (!usernameTokenConcat.equals(":")) {
// token-macro replacment
usernameTokenConcat = TokenMacro.expandAll(build, listener, usernameTokenConcat);
byte[] encodedAuthKey = Base64.encodeBase64(usernameTokenConcat.getBytes());
connection.setRequestProperty("Authorization", "Basic " + new String(encodedAuthKey));
}
connection.setDoInput(true);
connection.setRequestProperty("Accept", "application/json");
connection.setRequestMethod(requestType);
// wait up to 5 seconds for the connection to be open
connection.setConnectTimeout(5000);
connection.connect();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
// String response = "";
StringBuilder response = new StringBuilder();
while ((line = rd.readLine()) != null) {
response.append(line);
}
rd.close();
// JSONSerializer serializer = new JSONSerializer();
// need to parse the data we get back into struct
//listener.getLogger().println("Called URL: '" + urlString + "', got response: '" + response.toString() + "'");
if ( response.toString().isEmpty() ) {
listener.getLogger().println("Remote Jenkins server returned empty response to trigger.");
return null;
} else {
responseObject = (JSONObject) JSONSerializer.toJSON(response.toString());
}
} catch (IOException e) {
//If we have ConnectionRetryLimit set to > 0 then retry that many times.
if ( NumberOfAttempts <= this.getConnectionRetryLimit() ) {
listener.getLogger().println("Connection to remote server failed, waiting for to retry - " + this.pollInterval + " seconds until next attempt.");
// Sleep for 'pollInterval' seconds.
// Sleep takes miliseconds so need to convert this.pollInterval to milisecopnds (x 1000)
try {
// Could do with a better way of sleeping...
Thread.sleep(this.pollInterval * 1000);
} catch (InterruptedException ex) {
this.failBuild(ex, listener);
}
String strNumberOfRetries = Integer.toString(NumberOfAttempts);
String strConnectionRetryLimit = Integer.toString(this.getConnectionRetryLimit() );
listener.getLogger().println("Retrying (attempt " + strNumberOfRetries + " out of " + strConnectionRetryLimit );
responseObject = sendHTTPCall(urlString, requestType, build, listener, NumberOfAttempts+1);
}
// something failed with the connection, so throw an exception to mark the build as failed.
else {
this.failBuild(e, listener);
}
} catch (MacroEvaluationException e) {
this.failBuild(e, listener);
} catch (InterruptedException e) {
this.failBuild(e, listener);
} finally {
// always make sure we close the connection
if (connection != null) {
connection.disconnect();
}
// and always clear the query string and remove some "global" values
this.clearQueryString();
// this.build = null;
// this.listener = null;
}
return responseObject;
}
...
..
.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment