diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/CloudRecordingClientImpl.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/CloudRecordingClientImpl.java index 1ac4e9b..989fca9 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/CloudRecordingClientImpl.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/CloudRecordingClientImpl.java @@ -31,18 +31,24 @@ public class CloudRecordingClientImpl extends CloudRecordingClient { private final MixScenario mixScenario; + private final static Integer MAX_ATTEMPTS = 3; + + private final static String pathPrefix = "/v1/apps/%s/cloud_recording"; + protected CloudRecordingClientImpl(Context context) { - this.acquireResourceAPI = new AcquireResourceAPI(context); - this.queryResourceAPI = new QueryResourceAPI(context); - this.startResourceAPI = new StartResourceAPI(context); - this.stopResourceAPI = new StopResourceAPI(context); - this.updateResourceAPI = new UpdateResourceAPI(context); + this.acquireResourceAPI = new AcquireResourceAPI(context, pathPrefix, MAX_ATTEMPTS); + this.queryResourceAPI = new QueryResourceAPI(context, pathPrefix, MAX_ATTEMPTS); + this.startResourceAPI = new StartResourceAPI(context, pathPrefix, MAX_ATTEMPTS); + this.stopResourceAPI = new StopResourceAPI(context, pathPrefix, MAX_ATTEMPTS); + this.updateResourceAPI = new UpdateResourceAPI(context, pathPrefix, MAX_ATTEMPTS); this.individualScenario = new IndividualScenarioImpl(acquireResourceAPI, queryResourceAPI, startResourceAPI, updateResourceAPI, stopResourceAPI); - this.webScenario = new WebScenarioImpl(acquireResourceAPI, queryResourceAPI, startResourceAPI, updateResourceAPI, + this.webScenario = new WebScenarioImpl(acquireResourceAPI, queryResourceAPI, startResourceAPI, + updateResourceAPI, stopResourceAPI); - this.mixScenario = new MixScenarioImpl(acquireResourceAPI, queryResourceAPI, startResourceAPI, updateResourceAPI, + this.mixScenario = new MixScenarioImpl(acquireResourceAPI, queryResourceAPI, startResourceAPI, + updateResourceAPI, stopResourceAPI); } @@ -59,17 +65,17 @@ public Mono query(String resourceId, String sid, CloudRecordin } public Mono stop(String resourceId, String sid, CloudRecordingModeEnum mode, - StopResourceReq request) { + StopResourceReq request) { return stopResourceAPI.handle(resourceId, sid, mode, request); } public Mono update(String resourceId, String sid, CloudRecordingModeEnum mode, - UpdateResourceReq request) { + UpdateResourceReq request) { return updateResourceAPI.handle(resourceId, sid, mode, request); } public Mono updateLayout(String resourceId, String sid, CloudRecordingModeEnum mode, - UpdateLayoutResourceReq request) { + UpdateLayoutResourceReq request) { return updateResourceAPI.handleLayout(resourceId, sid, mode, request); } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/AcquireResourceAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/AcquireResourceAPI.java index ac080c8..b03094e 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/AcquireResourceAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/AcquireResourceAPI.java @@ -1,22 +1,22 @@ package io.agora.rest.services.cloudrecording.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.cloudrecording.api.req.AcquireResourceReq; import io.agora.rest.services.cloudrecording.api.res.AcquireResourceRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class AcquireResourceAPI { +public class AcquireResourceAPI extends BaseAPI { - private final Context context; - - public AcquireResourceAPI(Context context) { - this.context = context; + public AcquireResourceAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(AcquireResourceReq request) { - String path = String.format("/v1/apps/%s/cloud_recording/acquire", - this.context.getAgoraConfig().getAppId()); - return this.context.sendRequest(path, HttpMethod.POST, request, AcquireResourceRes.class); + String path = String.format("%s/acquire", + this.pathPrefix); + return this.context.sendRequest(path, HttpMethod.POST, request, AcquireResourceRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/BaseAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/BaseAPI.java new file mode 100644 index 0000000..fc37d76 --- /dev/null +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/BaseAPI.java @@ -0,0 +1,41 @@ +package io.agora.rest.services.cloudrecording.api; + +import java.time.Duration; +import java.util.function.Predicate; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.agora.rest.core.Context; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; + +public abstract class BaseAPI { + protected final Context context; + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + protected final Integer maxAttempts; + + protected final String pathPrefix; + + public BaseAPI(Context context, String pathPrefix, Integer maxAttempts) { + this.context = context; + this.pathPrefix = pathPrefix; + this.maxAttempts = maxAttempts; + } + + protected RetryBackoffSpec customRetry(Predicate retryPredicate) { + return Retry.backoff(maxAttempts, Duration.ofSeconds(1)) // Maximum 5 retry attempts, initial 1-second interval + .maxBackoff(Duration.ofSeconds(5)) // Maximum 5-second interval + .filter(retryPredicate) // Retry condition + .doBeforeRetry(retrySignal -> { + long retryCount = retrySignal.totalRetries() + 1; // Current retry attempt number + Duration nextBackoff = Duration.ofSeconds(retryCount); // Next retry interval + logger.warn("Retry attempt: {}, next backoff: {}", retryCount, nextBackoff); + }).onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> { + logger.error("Retry exhausted: {}", retrySignal.totalRetries()); + return retrySignal.failure(); + }); + } +} diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/QueryResourceAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/QueryResourceAPI.java index cef8b48..0e33f65 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/QueryResourceAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/QueryResourceAPI.java @@ -2,27 +2,23 @@ import io.agora.rest.core.Context; import io.agora.rest.exception.AgoraJsonException; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.cloudrecording.api.res.QueryResourceRes; import io.agora.rest.services.cloudrecording.enums.CloudRecordingModeEnum; import io.netty.handler.codec.http.HttpMethod; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; -public class QueryResourceAPI { +public class QueryResourceAPI extends BaseAPI { - private static final Logger logger = LoggerFactory.getLogger(QueryResourceAPI.class); - - private final Context context; - - public QueryResourceAPI(Context context) { - this.context = context; + public QueryResourceAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String resourceId, String sid, CloudRecordingModeEnum mode) { - String path = String.format("/v1/apps/%s/cloud_recording/resourceid/%s/sid/%s/mode/%s/query", - this.context.getAgoraConfig().getAppId(), resourceId, sid, mode.getMode()); + String path = String.format("%s/resourceid/%s/sid/%s/mode/%s/query", + this.pathPrefix, resourceId, sid, mode.getMode()); return this.context.sendRequest(path, HttpMethod.GET, null, QueryResourceRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)) .handle((resp, sink) -> { try { resp.setServerResponse(mode); diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StartResourceAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StartResourceAPI.java index 3498f43..5afaa3a 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StartResourceAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StartResourceAPI.java @@ -6,49 +6,20 @@ import io.agora.rest.services.cloudrecording.api.res.StartResourceRes; import io.agora.rest.services.cloudrecording.enums.CloudRecordingModeEnum; import io.netty.handler.codec.http.HttpMethod; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; -import reactor.util.retry.Retry; -import reactor.util.retry.RetryBackoffSpec; -import java.time.Duration; -import java.util.function.Predicate; +public class StartResourceAPI extends BaseAPI { - -public class StartResourceAPI { - - private static final Logger logger = LoggerFactory.getLogger(StartResourceAPI.class); - - private final Context context; - - private final static int MAX_ATTEMPTS = 3; - - public StartResourceAPI(Context context) { - this.context = context; + public StartResourceAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String resourceId, CloudRecordingModeEnum mode, StartResourceReq request) { - String path = String.format("/v1/apps/%s/cloud_recording/resourceid/%s/mode/%s/start", - this.context.getAgoraConfig().getAppId(), resourceId, mode.getMode()); + String path = String.format("%s/resourceid/%s/mode/%s/start", + this.pathPrefix, resourceId, mode.getMode()); return this.context.sendRequest(path, HttpMethod.POST, request, StartResourceRes.class) - .retryWhen(customRetry(MAX_ATTEMPTS, e -> e instanceof AgoraNeedRetryException)); - } - - - private RetryBackoffSpec customRetry(int maxAttempts, Predicate retryPredicate) { - return Retry.backoff(maxAttempts, Duration.ofSeconds(1)) // Maximum 5 retry attempts, initial 1-second interval - .maxBackoff(Duration.ofSeconds(5)) // Maximum 5-second interval - .filter(retryPredicate) // Retry condition - .doBeforeRetry(retrySignal -> { - long retryCount = retrySignal.totalRetries() + 1; // Current retry attempt number - Duration nextBackoff = Duration.ofSeconds(retryCount); // Next retry interval - logger.warn("Retry attempt: {}, next backoff: {}", retryCount, nextBackoff); - }).onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> { - logger.error("Retry exhausted: {}", retrySignal.totalRetries()); - return retrySignal.failure(); - }); + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StopResourceAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StopResourceAPI.java index 2e165ba..a1d4964 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StopResourceAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/StopResourceAPI.java @@ -1,24 +1,24 @@ package io.agora.rest.services.cloudrecording.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.cloudrecording.api.req.StopResourceReq; import io.agora.rest.services.cloudrecording.api.res.StopResourceRes; import io.agora.rest.services.cloudrecording.enums.CloudRecordingModeEnum; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class StopResourceAPI { +public class StopResourceAPI extends BaseAPI { - private final Context context; - - public StopResourceAPI(Context context) { - this.context = context; + public StopResourceAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String resourceId, String sid, CloudRecordingModeEnum mode, - StopResourceReq request) { - String path = String.format("/v1/apps/%s/cloud_recording/resourceid/%s/sid/%s/mode/%s/stop", - this.context.getAgoraConfig().getAppId(), resourceId, sid, mode.getMode()); - return this.context.sendRequest(path, HttpMethod.POST, request, StopResourceRes.class); + StopResourceReq request) { + String path = String.format("%s/resourceid/%s/sid/%s/mode/%s/stop", + this.pathPrefix, resourceId, sid, mode.getMode()); + return this.context.sendRequest(path, HttpMethod.POST, request, StopResourceRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/UpdateResourceAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/UpdateResourceAPI.java index a5b1116..22df3bc 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/UpdateResourceAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/cloudrecording/api/UpdateResourceAPI.java @@ -1,6 +1,7 @@ package io.agora.rest.services.cloudrecording.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.cloudrecording.api.req.UpdateLayoutResourceReq; import io.agora.rest.services.cloudrecording.api.req.UpdateResourceReq; import io.agora.rest.services.cloudrecording.api.res.UpdateLayoutResourceRes; @@ -9,31 +10,31 @@ import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class UpdateResourceAPI { +public class UpdateResourceAPI extends BaseAPI { - private final Context context; - - public UpdateResourceAPI(Context context) { - this.context = context; + public UpdateResourceAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String resourceId, String sid, CloudRecordingModeEnum mode, - UpdateResourceReq request) { - String path = String.format("/v1/apps/%s/cloud_recording/resourceid/%s/sid/%s/mode/%s/update", - this.context.getAgoraConfig().getAppId(), + UpdateResourceReq request) { + String path = String.format("%s/resourceid/%s/sid/%s/mode/%s/update", + this.pathPrefix, resourceId, sid, mode.getMode()); - return this.context.sendRequest(path, HttpMethod.POST, request, UpdateResourceRes.class); + return this.context.sendRequest(path, HttpMethod.POST, request, UpdateResourceRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } public Mono handleLayout(String resourceId, String sid, CloudRecordingModeEnum mode, - UpdateLayoutResourceReq request) { - String path = String.format("/v1/apps/%s/cloud_recording/resourceid/%s/sid/%s/mode/%s/updateLayout", - this.context.getAgoraConfig().getAppId(), + UpdateLayoutResourceReq request) { + String path = String.format("%s/resourceid/%s/sid/%s/mode/%s/updateLayout", + this.pathPrefix, resourceId, sid, mode.getMode()); - return this.context.sendRequest(path, HttpMethod.POST, request, UpdateLayoutResourceRes.class); + return this.context.sendRequest(path, HttpMethod.POST, request, UpdateLayoutResourceRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/ConvoAIClientImpl.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/ConvoAIClientImpl.java index 8ebaf5d..37e18b5 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/ConvoAIClientImpl.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/ConvoAIClientImpl.java @@ -38,16 +38,18 @@ public class ConvoAIClientImpl extends ConvoAIClient { private final static String globalPrefixTpl = "/api/conversational-ai-agent/v2/projects/%s"; + private final static Integer MAX_ATTEMPTS = 3; + protected ConvoAIClientImpl(Context context, ConvoAIServiceRegionEnum serviceRegionEnum) { String pathPrefix = getPathPrefix(context, serviceRegionEnum); - joinConvoAIAPI = new JoinConvoAIAPI(context, pathPrefix); - leaveConvoAIAPI = new LeaveConvoAIAPI(context, pathPrefix); - listConvoAIAPI = new ListConvoAIAPI(context, pathPrefix); - queryConvoAIAPI = new QueryConvoAIAPI(context, pathPrefix); - updateConvoAIAPI = new UpdateConvoAIAPI(context, pathPrefix); - historyConvoAIAPI = new HistoryConvoAIAPI(context, pathPrefix); - interruptConvoAIAPI = new InterruptConvoAIAPI(context, pathPrefix); - speakConvoAIAPI = new SpeakConvoAIAPI(context, pathPrefix); + joinConvoAIAPI = new JoinConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + leaveConvoAIAPI = new LeaveConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + listConvoAIAPI = new ListConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + queryConvoAIAPI = new QueryConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + updateConvoAIAPI = new UpdateConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + historyConvoAIAPI = new HistoryConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + interruptConvoAIAPI = new InterruptConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); + speakConvoAIAPI = new SpeakConvoAIAPI(context, pathPrefix, MAX_ATTEMPTS); } private String getPathPrefix(Context context, ConvoAIServiceRegionEnum serviceRegionEnum) { diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/BaseAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/BaseAPI.java new file mode 100644 index 0000000..f6e1800 --- /dev/null +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/BaseAPI.java @@ -0,0 +1,39 @@ +package io.agora.rest.services.convoai.api; + +import io.agora.rest.core.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.util.retry.Retry; +import reactor.util.retry.RetryBackoffSpec; +import java.time.Duration; +import java.util.function.Predicate; + +public abstract class BaseAPI { + protected final Context context; + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + protected final Integer maxAttempts; + + protected final String pathPrefix; + + public BaseAPI(Context context, String pathPrefix, Integer maxAttempts) { + this.context = context; + this.pathPrefix = pathPrefix; + this.maxAttempts = maxAttempts; + } + + protected RetryBackoffSpec customRetry(Predicate retryPredicate) { + return Retry.backoff(maxAttempts, Duration.ofSeconds(1)) // Maximum 5 retry attempts, initial 1-second interval + .maxBackoff(Duration.ofSeconds(5)) // Maximum 5-second interval + .filter(retryPredicate) // Retry condition + .doBeforeRetry(retrySignal -> { + long retryCount = retrySignal.totalRetries() + 1; // Current retry attempt number + Duration nextBackoff = Duration.ofSeconds(retryCount); // Next retry interval + logger.warn("Retry attempt: {}, next backoff: {}", retryCount, nextBackoff); + }).onRetryExhaustedThrow((retryBackoffSpec, retrySignal) -> { + logger.error("Retry exhausted: {}", retrySignal.totalRetries()); + return retrySignal.failure(); + }); + } +} diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/HistoryConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/HistoryConvoAIAPI.java index c70a798..72cb508 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/HistoryConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/HistoryConvoAIAPI.java @@ -1,22 +1,20 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.res.HistoryConvoAIRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class HistoryConvoAIAPI { - private final Context context; +public class HistoryConvoAIAPI extends BaseAPI { - private final String pathPrefix; - - public HistoryConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public HistoryConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String agentId) { String path = String.format("%s/agents/%s/history", pathPrefix, agentId); - return this.context.sendRequest(path, HttpMethod.GET, null, HistoryConvoAIRes.class); + return this.context.sendRequest(path, HttpMethod.GET, null, HistoryConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/InterruptConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/InterruptConvoAIAPI.java index e143c4f..4a94e66 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/InterruptConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/InterruptConvoAIAPI.java @@ -1,22 +1,20 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.res.InterruptConvoAIRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class InterruptConvoAIAPI { - private final Context context; +public class InterruptConvoAIAPI extends BaseAPI { - private final String pathPrefix; - - public InterruptConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public InterruptConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String agentId) { String path = String.format("%s/agents/%s/interrupt", pathPrefix, agentId); - return this.context.sendRequest(path, HttpMethod.POST, null, InterruptConvoAIRes.class); + return this.context.sendRequest(path, HttpMethod.POST, null, InterruptConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/JoinConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/JoinConvoAIAPI.java index b6ce239..a44ed62 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/JoinConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/JoinConvoAIAPI.java @@ -1,26 +1,23 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.req.JoinConvoAIReq; import io.agora.rest.services.convoai.res.JoinConvoAIRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class JoinConvoAIAPI { +public class JoinConvoAIAPI extends BaseAPI { - private final Context context; - - private final String pathPrefix; - - public JoinConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public JoinConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(JoinConvoAIReq request) { String path = String.format("%s/join", pathPrefix); - return this.context.sendRequest(path, HttpMethod.POST, request, JoinConvoAIRes.class); + return this.context.sendRequest(path, HttpMethod.POST, request, JoinConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/LeaveConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/LeaveConvoAIAPI.java index 7323a69..1a40808 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/LeaveConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/LeaveConvoAIAPI.java @@ -1,22 +1,19 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class LeaveConvoAIAPI { +public class LeaveConvoAIAPI extends BaseAPI { - private final Context context; - - private final String pathPrefix; - - public LeaveConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public LeaveConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String agentId) { String path = String.format("%s/agents/%s/leave", pathPrefix, agentId); - return this.context.sendRequest(path, HttpMethod.POST, null, Void.class); + return this.context.sendRequest(path, HttpMethod.POST, null, Void.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/ListConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/ListConvoAIAPI.java index 07ed7f9..39b408c 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/ListConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/ListConvoAIAPI.java @@ -1,24 +1,16 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.req.ListConvoAIReq; import io.agora.rest.services.convoai.res.ListConvoAIRes; import io.netty.handler.codec.http.HttpMethod; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; -public class ListConvoAIAPI { +public class ListConvoAIAPI extends BaseAPI { - private static final Logger logger = LoggerFactory.getLogger(ListConvoAIAPI.class); - - private final Context context; - - private final String pathPrefix; - - public ListConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public ListConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(ListConvoAIReq request) { @@ -31,6 +23,7 @@ public Mono handle(ListConvoAIReq request) { logger.debug("path:{}", path); - return this.context.sendRequest(path.toString(), HttpMethod.GET, null, ListConvoAIRes.class); + return this.context.sendRequest(path.toString(), HttpMethod.GET, null, ListConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/QueryConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/QueryConvoAIAPI.java index afe8d40..acec7c1 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/QueryConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/QueryConvoAIAPI.java @@ -1,23 +1,20 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.res.QueryConvoAIRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class QueryConvoAIAPI { +public class QueryConvoAIAPI extends BaseAPI { - private final Context context; - - private final String pathPrefix; - - public QueryConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public QueryConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String agentId) { String path = String.format("%s/agents/%s", pathPrefix, agentId); - return this.context.sendRequest(path, HttpMethod.GET, null, QueryConvoAIRes.class); + return this.context.sendRequest(path, HttpMethod.GET, null, QueryConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/SpeakConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/SpeakConvoAIAPI.java index 686014b..a3a8d64 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/SpeakConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/SpeakConvoAIAPI.java @@ -1,24 +1,22 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.req.SpeakConvoAIReq; import io.agora.rest.services.convoai.res.SpeakConvoAIRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; -public class SpeakConvoAIAPI { - private final Context context; +public class SpeakConvoAIAPI extends BaseAPI { - private final String pathPrefix; - - public SpeakConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public SpeakConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String agentId, SpeakConvoAIReq request) { String path = String.format("%s/agents/%s/speak", pathPrefix, agentId); - return this.context.sendRequest(path, HttpMethod.POST, request, SpeakConvoAIRes.class); + return this.context.sendRequest(path, HttpMethod.POST, request, SpeakConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } } diff --git a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/UpdateConvoAIAPI.java b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/UpdateConvoAIAPI.java index 2584630..934ca20 100644 --- a/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/UpdateConvoAIAPI.java +++ b/agora-rest-client-core/src/main/java/io/agora/rest/services/convoai/api/UpdateConvoAIAPI.java @@ -1,25 +1,21 @@ package io.agora.rest.services.convoai.api; import io.agora.rest.core.Context; +import io.agora.rest.exception.AgoraNeedRetryException; import io.agora.rest.services.convoai.req.UpdateConvoAIReq; import io.agora.rest.services.convoai.res.UpdateConvoAIRes; import io.netty.handler.codec.http.HttpMethod; import reactor.core.publisher.Mono; +public class UpdateConvoAIAPI extends BaseAPI { -public class UpdateConvoAIAPI { - - private final Context context; - - private final String pathPrefix; - - public UpdateConvoAIAPI(Context context, String pathPrefix) { - this.context = context; - this.pathPrefix = pathPrefix; + public UpdateConvoAIAPI(Context context, String pathPrefix, Integer maxAttempts) { + super(context, pathPrefix, maxAttempts); } public Mono handle(String agentId, UpdateConvoAIReq request) { String path = String.format("%s/agents/%s/update", pathPrefix, agentId); - return this.context.sendRequest(path, HttpMethod.POST, request, UpdateConvoAIRes.class); + return this.context.sendRequest(path, HttpMethod.POST, request, UpdateConvoAIRes.class) + .retryWhen(customRetry(e -> e instanceof AgoraNeedRetryException)); } }