From 871dd183590f2cace371206409f03b4aad2018ce Mon Sep 17 00:00:00 2001 From: Sai Aditya Mukkamala Date: Mon, 16 Oct 2023 18:29:29 +0530 Subject: [PATCH 1/2] Fix error thrown by connector when 429 response code is received --- .../apiclient/RetryableException.java | 4 +++ .../ServiceNowTableAPIClientImpl.java | 10 ++++-- .../servicenow/restapi/RestAPIResponse.java | 33 +++++++++++++++---- 3 files changed, 39 insertions(+), 8 deletions(-) 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..eaf6d4e5 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; @@ -116,12 +118,31 @@ 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)) { - isRetryable = true; + 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 (JsonSyntaxException e) { + // Response Body is not a json object - check status code for error + // Response body necessarily need not be json always (when 429 error is thrown - + // responseBody is HTML) + 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"); + } + } catch (Throwable t) { + // Any other exception + isRetryable = false; + this.responseBody = String.format(JSON_ERROR_RESPONSE_TEMPLATE, t.getMessage()); } } From 55415a082ed2e9afad93bb9c333856fb71749fba Mon Sep 17 00:00:00 2001 From: Sai Aditya Mukkamala Date: Mon, 16 Oct 2023 18:29:29 +0530 Subject: [PATCH 2/2] Fix error thrown by connector when 429 response code is received --- .../servicenow/restapi/RestAPIResponse.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) 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 eaf6d4e5..6cd8c5e8 100644 --- a/src/main/java/io/cdap/plugin/servicenow/restapi/RestAPIResponse.java +++ b/src/main/java/io/cdap/plugin/servicenow/restapi/RestAPIResponse.java @@ -117,6 +117,13 @@ public boolean isSuccess() { } private void checkRetryable() { + 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); @@ -128,19 +135,8 @@ private void checkRetryable() { .contains(ServiceNowConstants.MAXIMUM_EXECUTION_TIME_EXCEEDED)) { isRetryable = true; } - } catch (JsonSyntaxException e) { - // Response Body is not a json object - check status code for error - // Response body necessarily need not be json always (when 429 error is thrown - - // responseBody is HTML) - 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"); - } } catch (Throwable t) { - // Any other exception + // Any exception isRetryable = false; this.responseBody = String.format(JSON_ERROR_RESPONSE_TEMPLATE, t.getMessage()); }