diff --git a/sdk-common/src/main/java/dev/restate/sdk/client/DefaultIngressClient.java b/sdk-common/src/main/java/dev/restate/sdk/client/DefaultIngressClient.java index 2357999d..903719cd 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/client/DefaultIngressClient.java +++ b/sdk-common/src/main/java/dev/restate/sdk/client/DefaultIngressClient.java @@ -97,10 +97,10 @@ public CompletableFuture sendAsync( public AwakeableHandle awakeableHandle(String id) { return new AwakeableHandle() { @Override - public CompletableFuture resolve(Serde serde, @NonNull T payload) { + public CompletableFuture resolveAsync(Serde serde, @NonNull T payload) { // Prepare request var reqBuilder = - HttpRequest.newBuilder().uri(URI.create("/restate/awakeables/" + id + "/resolve")); + HttpRequest.newBuilder().uri(baseUri.resolve("/restate/awakeables/" + id + "/resolve")); // Add content-type if (serde.contentType() != null) { @@ -132,11 +132,11 @@ public CompletableFuture resolve(Serde serde, @NonNull T payload) { } @Override - public CompletableFuture reject(String reason) { + public CompletableFuture rejectAsync(String reason) { // Prepare request var reqBuilder = HttpRequest.newBuilder() - .uri(URI.create("/restate/awakeables/" + id + "/reject")) + .uri(baseUri.resolve("/restate/awakeables/" + id + "/reject")) .header("content-type", "text-plain"); // Add headers diff --git a/sdk-common/src/main/java/dev/restate/sdk/client/IngressClient.java b/sdk-common/src/main/java/dev/restate/sdk/client/IngressClient.java index 1e927a97..3064252c 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/client/IngressClient.java +++ b/sdk-common/src/main/java/dev/restate/sdk/client/IngressClient.java @@ -80,20 +80,44 @@ default String send(Target target, Serde reqSerde, Req req) throws In * ingress */ interface AwakeableHandle { + /** Same as {@link #resolve(Serde, Object)} but async. */ + CompletableFuture resolveAsync(Serde serde, @NonNull T payload); + /** * Complete with success the Awakeable. * * @param serde used to serialize the Awakeable result payload. * @param payload the result payload. MUST NOT be null. */ - CompletableFuture resolve(Serde serde, @NonNull T payload); + default void resolve(Serde serde, @NonNull T payload) { + try { + resolveAsync(serde, payload).join(); + } catch (CompletionException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw new RuntimeException(e.getCause()); + } + } + + /** Same as {@link #reject(String)} but async. */ + CompletableFuture rejectAsync(String reason); /** * Complete with failure the Awakeable. * * @param reason the rejection reason. MUST NOT be null. */ - CompletableFuture reject(String reason); + default void reject(String reason) { + try { + rejectAsync(reason).join(); + } catch (CompletionException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw new RuntimeException(e.getCause()); + } + } } static IngressClient defaultClient(String baseUri) {