From 2c5c803f41e5333ad29ea2ba3454be46917a9d16 Mon Sep 17 00:00:00 2001 From: Hugo1307 Date: Wed, 26 Apr 2023 11:58:24 +0100 Subject: [PATCH 1/2] fix: Fixed Synchronous Action Call deadlock. --- dependency-reduced-pom.xml | 2 +- pom.xml | 2 +- .../metaapi/requests/RequestGenerator.java | 25 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index bfffe18..65ddbaa 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.mymetaverse.sdk java-sdk - 2.5.0 + 2.5.2 package install ${project.name}-${project.version} diff --git a/pom.xml b/pom.xml index 046e737..1e99252 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.mymetaverse.sdk java-sdk - 2.5.0 + 2.5.2 8 diff --git a/src/main/java/io/mymetavese/metaapi/requests/RequestGenerator.java b/src/main/java/io/mymetavese/metaapi/requests/RequestGenerator.java index df4b8d6..f12ae14 100644 --- a/src/main/java/io/mymetavese/metaapi/requests/RequestGenerator.java +++ b/src/main/java/io/mymetavese/metaapi/requests/RequestGenerator.java @@ -8,7 +8,6 @@ import okhttp3.internal.http.HttpMethod; import java.io.IOException; -import java.util.Objects; public class RequestGenerator { @@ -29,6 +28,7 @@ public void asyncRequest(Request request) { } public void request(Request request) { + String route = request.getCompiledRoute(); okhttp3.Request.Builder builder = new okhttp3.Request.Builder(); @@ -52,28 +52,29 @@ else if(bodyObject != null) if (request.getHeaders() != null && !request.getHeaders().isEmpty()) request.getHeaders().forEach(builder::addHeader); - // Maybe should add attempts here. - try(Response response = httpClient.newCall(builder.build()).execute()) { + try (Response response = httpClient.newCall(builder.build()).execute()) { + if (response.code() >= 500) { - throw new IOException("Internal server error: " + Objects.requireNonNull(response.body()).string()); + String responseBodyString = response.peekBody(Long.MAX_VALUE).string(); + request.handleResponse(response); + throw new IOException("Internal server error: " + responseBodyString); } - if(response.code() == 401 && request.getAttempts() < 2) { + // Try to Re-authenticate if the token is invalid and the re-authentication has not been attempted for more + // than 2 times. + if (response.code() == 401 && request.getAttempts() < 2) { + request.addAttempt(); api.getTokenHandler().authenticate(); this.request(request); - return; + + } else { + request.handleResponse(response); } - request.handleResponse(response); } catch (IOException ex) { ex.printStackTrace(); - - if(request.getAttempts() < 2) { - request.addAttempt(); - this.request(request); - } } } From 757d15504451e2604adb1eb939ff3bc75d302cc7 Mon Sep 17 00:00:00 2001 From: Hugo1307 Date: Wed, 26 Apr 2023 11:59:31 +0100 Subject: [PATCH 2/2] feat: Added support for Timeout in Synchronous Action Calls. --- .../java/io/mymetavese/metaapi/api/RestAction.java | 11 +++++++++-- .../mymetavese/metaapi/requests/RestActionImpl.java | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/mymetavese/metaapi/api/RestAction.java b/src/main/java/io/mymetavese/metaapi/api/RestAction.java index 6580a03..77acd5c 100644 --- a/src/main/java/io/mymetavese/metaapi/api/RestAction.java +++ b/src/main/java/io/mymetavese/metaapi/api/RestAction.java @@ -3,7 +3,9 @@ import io.mymetavese.metaapi.MetaAPIImpl; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.function.Consumer; public interface RestAction { @@ -23,7 +25,6 @@ public interface RestAction { /** * Submits a request for execution in asynchronous logic. * - * * @param success The success callback from the request. * @param failure The callback error from the request. */ @@ -32,7 +33,6 @@ public interface RestAction { /** * Submits a request for execution in asynchronous logic. * - * * @param success The success callback from the request. */ default void queue(Consumer success) { @@ -46,6 +46,13 @@ default void queue(Consumer success) { */ T complete(); + /** + * Submits a Request in synchronous logic with a Timeout + * + * @return The response of the Request. + */ + T complete(long timeout, TimeUnit timeUnit) throws ExecutionException, InterruptedException, TimeoutException; + /** * Submits a request for execution after some time delay. * @param time The time diff --git a/src/main/java/io/mymetavese/metaapi/requests/RestActionImpl.java b/src/main/java/io/mymetavese/metaapi/requests/RestActionImpl.java index e64ea4c..544ceee 100644 --- a/src/main/java/io/mymetavese/metaapi/requests/RestActionImpl.java +++ b/src/main/java/io/mymetavese/metaapi/requests/RestActionImpl.java @@ -15,6 +15,9 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.function.Consumer; public abstract class RestActionImpl extends Transformable implements RestAction { @@ -104,5 +107,11 @@ public void queue(Consumer success, Consumer fa public T complete() { return submit().join(); } + + @Override + public T complete(long timeout, TimeUnit timeUnit) throws ExecutionException, InterruptedException, TimeoutException { + return submit().get(timeout, timeUnit); + } + }