diff --git a/src/main/java/io/cdap/plugin/servicenow/apiclient/RetryableException.java b/src/main/java/io/cdap/plugin/servicenow/apiclient/RetryableException.java index 9c27192d..e51fa6dd 100644 --- a/src/main/java/io/cdap/plugin/servicenow/apiclient/RetryableException.java +++ b/src/main/java/io/cdap/plugin/servicenow/apiclient/RetryableException.java @@ -26,5 +26,9 @@ public class RetryableException extends RuntimeException { public RetryableException() { super(); } + + public RetryableException(String message) { + super(message); + } } diff --git a/src/main/java/io/cdap/plugin/servicenow/apiclient/ServiceNowTableAPIClientImpl.java b/src/main/java/io/cdap/plugin/servicenow/apiclient/ServiceNowTableAPIClientImpl.java index a0be6fa0..88241c49 100644 --- a/src/main/java/io/cdap/plugin/servicenow/apiclient/ServiceNowTableAPIClientImpl.java +++ b/src/main/java/io/cdap/plugin/servicenow/apiclient/ServiceNowTableAPIClientImpl.java @@ -132,9 +132,15 @@ public List> fetchTableRecords(String tableName, SourceValue apiResponse = executeGet(requestBuilder.build()); if (!apiResponse.isSuccess()) { if (apiResponse.isRetryable()) { - throw new RetryableException(); + throw new RetryableException( + String.format( + "Error in fetchTableRecords, http response code = %d, message = %s", + apiResponse.getHttpStatus(), apiResponse.getResponseBody())); } - return Collections.emptyList(); + throw new RuntimeException( + String.format( + "Error in fetchTableRecords, http response code = %d, message = %s", + apiResponse.getHttpStatus(), apiResponse.getResponseBody())); } return parseResponseToResultListOfMap(apiResponse.getResponseBody()); diff --git a/src/main/java/io/cdap/plugin/servicenow/restapi/RestAPIResponse.java b/src/main/java/io/cdap/plugin/servicenow/restapi/RestAPIResponse.java index dd33700e..6cd8c5e8 100644 --- a/src/main/java/io/cdap/plugin/servicenow/restapi/RestAPIResponse.java +++ b/src/main/java/io/cdap/plugin/servicenow/restapi/RestAPIResponse.java @@ -18,6 +18,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; import io.cdap.plugin.servicenow.util.ServiceNowConstants; import org.apache.http.Header; import org.apache.http.HttpResponse; @@ -48,6 +49,7 @@ public class RestAPIResponse { " },\n" + " \"status\": \"failure\"\n" + "}"; + private static final int HTTP_STATUS_TOO_MANY_REQUESTS = 429; private int httpStatus; private Map headers; private String responseBody; @@ -115,13 +117,28 @@ public boolean isSuccess() { } private void checkRetryable() { - Gson gson = new Gson(); - JsonObject jo = gson.fromJson(this.responseBody, JsonObject.class); - if (jo.get(ServiceNowConstants.STATUS) != null && - jo.get(ServiceNowConstants.STATUS).getAsString().equals(ServiceNowConstants.FAILURE) && - jo.getAsJsonObject(ServiceNowConstants.ERROR).get(ServiceNowConstants.MESSAGE).getAsString() - .contains(ServiceNowConstants.MAXIMUM_EXECUTION_TIME_EXCEEDED)) { + if (httpStatus == HTTP_STATUS_TOO_MANY_REQUESTS) { isRetryable = true; + this.responseBody = + String.format( + JSON_ERROR_RESPONSE_TEMPLATE, + "Too many requests to ServiceNow API - decrease concurrent requests"); + } + Gson gson = new Gson(); + try { + JsonObject jo = gson.fromJson(this.responseBody, JsonObject.class); + if (jo.get(ServiceNowConstants.STATUS) != null + && jo.get(ServiceNowConstants.STATUS).getAsString().equals(ServiceNowConstants.FAILURE) + && jo.getAsJsonObject(ServiceNowConstants.ERROR) + .get(ServiceNowConstants.MESSAGE) + .getAsString() + .contains(ServiceNowConstants.MAXIMUM_EXECUTION_TIME_EXCEEDED)) { + isRetryable = true; + } + } catch (Throwable t) { + // Any exception + isRetryable = false; + this.responseBody = String.format(JSON_ERROR_RESPONSE_TEMPLATE, t.getMessage()); } }