From 828d131a8f15490c12629815575977fc2992f72c Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 25 Mar 2024 11:14:53 +0100 Subject: [PATCH] Merge send and sendDelayed. Fix #262 --- .../src/main/resources/templates/Client.hbs | 22 +++++------------- .../src/main/resources/templates/Client.hbs | 23 ++++--------------- .../dev/restate/sdk/kotlin/ContextImpl.kt | 10 +------- .../main/kotlin/dev/restate/sdk/kotlin/api.kt | 16 ++----------- .../main/java/dev/restate/sdk/Context.java | 8 +++---- .../java/dev/restate/sdk/ContextImpl.java | 2 +- .../dev/restate/sdk/core/SyscallsImpl.java | 2 +- .../workflow/impl/WorkflowCodegenUtil.java | 2 +- .../workflow/impl/WorkflowContextImpl.java | 4 ++-- 9 files changed, 22 insertions(+), 67 deletions(-) diff --git a/sdk-api-gen/src/main/resources/templates/Client.hbs b/sdk-api-gen/src/main/resources/templates/Client.hbs index 8d73c2cf..b3022fc9 100644 --- a/sdk-api-gen/src/main/resources/templates/Client.hbs +++ b/sdk-api-gen/src/main/resources/templates/Client.hbs @@ -49,38 +49,28 @@ public class {{generatedClassSimpleName}} { }{{/handlers}} public Send send() { - return new Send(); + return new Send(null); } - public SendDelayed sendDelayed(Duration delay) { - return new SendDelayed(delay); + public Send send(Duration delay) { + return new Send(delay); } public class Send { - {{#handlers}} - public void {{name}}({{^inputEmpty}}{{{inputFqcn}}} req{{/inputEmpty}}) { - ContextClient.this.ctx.send( - {{#if isObject}}Target.virtualObject(COMPONENT_NAME, ContextClient.this.key, "{{name}}"){{else}}Target.service(COMPONENT_NAME, "{{name}}"){{/if}}, - {{inputSerdeFieldName}}, - {{#if inputEmpty}}null{{else}}req{{/if}}); - }{{/handlers}} - } - - public class SendDelayed { private final Duration delay; - SendDelayed(Duration delay) { + Send(Duration delay) { this.delay = delay; } {{#handlers}} public void {{name}}({{^inputEmpty}}{{{inputFqcn}}} req{{/inputEmpty}}) { - ContextClient.this.ctx.sendDelayed( + ContextClient.this.ctx.send( {{#if isObject}}Target.virtualObject(COMPONENT_NAME, ContextClient.this.key, "{{name}}"){{else}}Target.service(COMPONENT_NAME, "{{name}}"){{/if}}, {{inputSerdeFieldName}}, {{#if inputEmpty}}null{{else}}req{{/if}}, - this.delay); + delay); }{{/handlers}} } } diff --git a/sdk-api-kotlin-gen/src/main/resources/templates/Client.hbs b/sdk-api-kotlin-gen/src/main/resources/templates/Client.hbs index c71192d1..47dc4b2f 100644 --- a/sdk-api-kotlin-gen/src/main/resources/templates/Client.hbs +++ b/sdk-api-kotlin-gen/src/main/resources/templates/Client.hbs @@ -39,33 +39,18 @@ object {{generatedClassSimpleName}} { {{#if inputEmpty}}Unit{{else}}req{{/if}}) }{{/handlers}} - fun send(): Send { - return Send() - } - - fun sendDelayed(delay: Duration): SendDelayed { - return SendDelayed(delay) + fun send(delay: Duration = Duration.ZERO): Send { + return Send(delay) } - inner class Send { + inner class Send(private val delay: Duration) { {{#handlers}} suspend fun {{name}}({{^inputEmpty}}req: {{{inputFqcn}}}{{/inputEmpty}}) { this@ContextClient.ctx.send( - {{#if isObject}}Target.virtualObject(COMPONENT_NAME, this@ContextClient.key, "{{name}}"){{else}}Target.service(COMPONENT_NAME, "{{name}}"){{/if}}, - {{inputSerdeFieldName}}, - {{#if inputEmpty}}Unit{{else}}req{{/if}}); - }{{/handlers}} - } - - inner class SendDelayed(private val delay: Duration) { - - {{#handlers}} - suspend fun {{name}}({{^inputEmpty}}req: {{{inputFqcn}}}{{/inputEmpty}}) { - this@ContextClient.ctx.sendDelayed( {{#if isObject}}Target.virtualObject(COMPONENT_NAME, this@ContextClient.key, "{{name}}"){{else}}Target.service(COMPONENT_NAME, "{{name}}"){{/if}}, {{inputSerdeFieldName}}, {{#if inputEmpty}}Unit{{else}}req{{/if}}, - this.delay); + delay); }{{/handlers}} } } diff --git a/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/ContextImpl.kt b/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/ContextImpl.kt index c8fce184..019e60c2 100644 --- a/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/ContextImpl.kt +++ b/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/ContextImpl.kt @@ -117,15 +117,7 @@ internal class ContextImpl internal constructor(private val syscalls: Syscalls) return SingleSerdeAwaitableImpl(syscalls, deferred, outputSerde) } - override suspend fun send(target: Target, inputSerde: Serde, parameter: T) { - val input = inputSerde.serializeWrappingException(syscalls, parameter) - - return suspendCancellableCoroutine { cont: CancellableContinuation -> - syscalls.send(target, input, null, completingUnitContinuation(cont)) - } - } - - override suspend fun sendDelayed( + override suspend fun send( target: Target, inputSerde: Serde, parameter: T, diff --git a/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/api.kt b/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/api.kt index 9d6d0e6f..f3de91e9 100644 --- a/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/api.kt +++ b/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/api.kt @@ -91,25 +91,13 @@ sealed interface Context { * @param target the address of the callee * @param inputSerde Input serde * @param parameter the invocation request parameter. - */ - suspend fun send(target: Target, inputSerde: Serde, parameter: T) - - /** - * Invoke another Restate service without waiting for the response after the provided `delay` has - * elapsed. - * - * This method returns immediately, as the timer is executed and awaited on Restate. - * - * @param target the address of the callee - * @param inputSerde Input serde - * @param parameter the invocation request parameter. * @param delay time to wait before executing the call */ - suspend fun sendDelayed( + suspend fun send( target: Target, inputSerde: Serde, parameter: T, - delay: Duration + delay: Duration = Duration.ZERO ) /** diff --git a/sdk-api/src/main/java/dev/restate/sdk/Context.java b/sdk-api/src/main/java/dev/restate/sdk/Context.java index 6d2b5122..85a2a781 100644 --- a/sdk-api/src/main/java/dev/restate/sdk/Context.java +++ b/sdk-api/src/main/java/dev/restate/sdk/Context.java @@ -70,11 +70,11 @@ default void send(Target target, byte[] parameter) { * @param parameter the invocation request parameter. * @param delay time to wait before executing the call. */ - void sendDelayed(Target target, Serde inputSerde, T parameter, Duration delay); + void send(Target target, Serde inputSerde, T parameter, Duration delay); - /** Like {@link #sendDelayed(Target, Serde, Object, Duration)} with raw input. */ - default void sendDelayed(Target target, byte[] parameter, Duration delay) { - sendDelayed(target, CoreSerdes.RAW, parameter, delay); + /** Like {@link #send(Target, Serde, Object, Duration)} with raw input. */ + default void send(Target target, byte[] parameter, Duration delay) { + send(target, CoreSerdes.RAW, parameter, delay); } /** diff --git a/sdk-api/src/main/java/dev/restate/sdk/ContextImpl.java b/sdk-api/src/main/java/dev/restate/sdk/ContextImpl.java index 039b23b1..afd51709 100644 --- a/sdk-api/src/main/java/dev/restate/sdk/ContextImpl.java +++ b/sdk-api/src/main/java/dev/restate/sdk/ContextImpl.java @@ -104,7 +104,7 @@ public void send(Target target, Serde inputSerde, T parameter) { } @Override - public void sendDelayed(Target target, Serde inputSerde, T parameter, Duration delay) { + public void send(Target target, Serde inputSerde, T parameter, Duration delay) { ByteString input = Util.serializeWrappingException(syscalls, inputSerde, parameter); Util.blockOnSyscall(cb -> syscalls.send(target, input, delay, cb)); } diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/SyscallsImpl.java b/sdk-core/src/main/java/dev/restate/sdk/core/SyscallsImpl.java index c7adb57e..fe261225 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/SyscallsImpl.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/SyscallsImpl.java @@ -208,7 +208,7 @@ public void send( if (target.getKey() != null) { builder.setKey(target.getKey()); } - if (delay != null) { + if (delay != null && !delay.isZero()) { builder.setInvokeTime(Instant.now().toEpochMilli() + delay.toMillis()); } diff --git a/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowCodegenUtil.java b/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowCodegenUtil.java index 6141035a..f2875cbe 100644 --- a/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowCodegenUtil.java +++ b/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowCodegenUtil.java @@ -113,7 +113,7 @@ public static void invokeSharedSendDelayed( String workflowKey, @Nullable Object payload, Duration delay) { - ctx.sendDelayed( + ctx.send( Target.service(workflowName, handlerName), WorkflowImpl.INVOKE_REQUEST_SERDE, InvokeRequest.fromAny(workflowKey, payload), diff --git a/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowContextImpl.java b/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowContextImpl.java index 7d180b89..8cff2876 100644 --- a/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowContextImpl.java +++ b/sdk-workflow-api/src/main/java/dev/restate/sdk/workflow/impl/WorkflowContextImpl.java @@ -204,8 +204,8 @@ public void send(Target target, Serde inputSerde, T parameter) { } @Override - public void sendDelayed(Target target, Serde inputSerde, T parameter, Duration delay) { - ctx.sendDelayed(target, inputSerde, parameter, delay); + public void send(Target target, Serde inputSerde, T parameter, Duration delay) { + ctx.send(target, inputSerde, parameter, delay); } @Override