Skip to content

Commit

Permalink
ID: FPCO-30257; HOURS: 4; DONE: 100; Add retry interceptor (#31)
Browse files Browse the repository at this point in the history
* ID: FPCO-30257; HOURS: 4; DONE: 100; Add retry interceptor
* ID: FPCO-30257; Bump up patch version
  • Loading branch information
ManishPrajapati-GoFynd authored Jun 27, 2024
1 parent 5ce1c09 commit e6f6b4d
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 1 deletion.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</parent>
<groupId>com.fynd</groupId>
<artifactId>fynd-extension-java</artifactId>
<version>0.6.1</version>
<version>0.6.2</version>
<name>fynd-extension-java</name>
<description>Java Fynd Extension Library</description>
<properties>
Expand Down
57 changes: 57 additions & 0 deletions src/main/java/com/fynd/extension/middleware/RetryInterceptor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.fynd.extension.middleware;

import java.io.IOException;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Interceptor;
import okhttp3.Response;

@Slf4j
public class RetryInterceptor implements Interceptor {

private int maxRetries = Integer.MAX_VALUE;

public static long calculateRetryTime(int attempt) {
long baseTime = 30 * 1000; // 30 seconds in milliseconds
long increasePerAttempt = 60 * 1000; // 1 minute in milliseconds

if (attempt <= 3) {
return baseTime;
} else {
return (attempt - 3) * increasePerAttempt;
}
}

@Override
public Response intercept(Chain chain) throws IOException {
int tryCount = 0;
while (tryCount < maxRetries) {
try {
Response response = chain.proceed(chain.request());
int responseCode = response.code();
if (responseCode == 502 || responseCode == 503 || responseCode == 504) {
throw new IOException("Request failed - " + tryCount);
} else {
return response;
}
} catch (IOException e) {
log.error("An error occurred: " + e.getMessage());
if (tryCount == maxRetries - 1) {
throw e; // Stop retrying after reaching max retries
}
long time = calculateRetryTime(tryCount + 1);
log.info("RetryInterceptor " + "Retrying request after " + time + "ms. Attempt: " + (tryCount + 1));
try {
Thread.sleep(time);
} catch (InterruptedException interruptedEx) {
// Handle the interruption here (optional)
log.error("RetryInterceptor Thread interrupted during retry " + interruptedEx.getMessage());
throw new IOException("Thread interrupted during retry", interruptedEx); // Re-throw as IOException
}

}
tryCount++;
}

return null; // This should never be reached
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/fynd/extension/model/Extension.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.fynd.extension.middleware.ClientCall;
import com.fynd.extension.middleware.ExtensionInterceptor;
import com.fynd.extension.middleware.FdkConstants;
import com.fynd.extension.middleware.RetryInterceptor;
import com.fynd.extension.service.WebhookService;
import com.fynd.extension.session.Session;
import com.fynd.extension.session.SessionStorage;
Expand Down Expand Up @@ -146,6 +147,7 @@ public Response<ExtensionDetailsDTO> getExtensionDetails(
List<Interceptor> interceptorList = new ArrayList<>();
interceptorList.add(new ExtensionInterceptor(extensionProperties));
interceptorList.add(new RequestSignerInterceptor());
interceptorList.add(new RetryInterceptor());
ClientCall clientCall = retrofitServiceFactory.createService(extensionProperties.getCluster(), ClientCall.class,
interceptorList);
return clientCall.getExtensionDetails(extensionProperties.getApiKey())
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/fynd/extension/service/WebhookService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.fynd.extension.middleware.ClientCall;
import com.fynd.extension.middleware.EventHandler;
import com.fynd.extension.middleware.PlatformClientCall;
import com.fynd.extension.middleware.RetryInterceptor;
import com.fynd.extension.model.Criteria;
import com.fynd.extension.model.EventMapProperties;
import com.fynd.extension.model.ExtensionProperties;
Expand Down Expand Up @@ -67,6 +68,7 @@ ClientCall getClientCallApiList(){
List<Interceptor> interceptorList = new ArrayList<>();
interceptorList.add(new ExtensionInterceptor(extensionProperties));
interceptorList.add(new RequestSignerInterceptor());
interceptorList.add(new RetryInterceptor());
ClientCall clientCall = retrofitServiceFactory.createService(extensionProperties.getCluster(), ClientCall.class,
interceptorList);
return clientCall;
Expand Down

0 comments on commit e6f6b4d

Please sign in to comment.