Interface Context
-
- All Known Subinterfaces:
ObjectContext,SharedObjectContext,SharedWorkflowContext,WorkflowContext
public interface ContextThis interface exposes the Restate functionalities to Restate services. It can be used to interact with other Restate services, record non-deterministic closures, execute timers and synchronize with external systems.All methods of this interface, and related interfaces, throws either
TerminalExceptionorAbortedExecutionException, where the former can be caught and acted upon, while the latter MUST NOT be caught, but simply propagated for clean up purposes.NOTE: This interface MUST NOT be accessed concurrently since it can lead to different orderings of user actions, corrupting the execution of the invocation.
-
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description <T> Awakeable<T>awakeable(dev.restate.sdk.common.Serde<T> serde)Create anAwakeable, addressable throughAwakeable.id().AwakeableHandleawakeableHandle(java.lang.String id)Create a newAwakeableHandlefor the provided identifier.default Awaitable<byte[]>call(dev.restate.sdk.common.Target target, byte[] parameter)Likecall(Target, Serde, Serde, Object)with raw input/output.<T,R>
Awaitable<R>call(dev.restate.sdk.common.Target target, dev.restate.sdk.common.Serde<T> inputSerde, dev.restate.sdk.common.Serde<R> outputSerde, T parameter)Invoke another Restate service method.RestateRandomrandom()dev.restate.sdk.common.Requestrequest()default voidrun(dev.restate.sdk.common.function.ThrowingRunnable runnable)Likerun(String, ThrowingRunnable), but without a name.default <T> Trun(dev.restate.sdk.common.Serde<T> serde, dev.restate.sdk.common.function.ThrowingSupplier<T> action)Likerun(String, Serde, ThrowingSupplier), but without a name.default voidrun(java.lang.String name, dev.restate.sdk.common.function.ThrowingRunnable runnable)Likerun(String, Serde, ThrowingSupplier), but without returning a value.<T> Trun(java.lang.String name, dev.restate.sdk.common.Serde<T> serde, dev.restate.sdk.common.function.ThrowingSupplier<T> action)Execute a non-deterministic closure, recording the result value in the journal.default voidsend(dev.restate.sdk.common.Target target, byte[] parameter)Likesend(Target, Serde, Object)with bytes input.default voidsend(dev.restate.sdk.common.Target target, byte[] parameter, java.time.Duration delay)Likesend(Target, Serde, Object, Duration)with bytes input.<T> voidsend(dev.restate.sdk.common.Target target, dev.restate.sdk.common.Serde<T> inputSerde, T parameter)Invoke another Restate service without waiting for the response.<T> voidsend(dev.restate.sdk.common.Target target, dev.restate.sdk.common.Serde<T> inputSerde, T parameter, java.time.Duration delay)Invoke another Restate service without waiting for the response after the provideddelayhas elapsed.default voidsleep(java.time.Duration duration)Causes the current execution of the function invocation to sleep for the given duration.Awaitable<java.lang.Void>timer(java.time.Duration duration)Causes the start of a timer for the given duration.
-
-
-
Method Detail
-
request
dev.restate.sdk.common.Request request()
-
call
<T,R> Awaitable<R> call(dev.restate.sdk.common.Target target, dev.restate.sdk.common.Serde<T> inputSerde, dev.restate.sdk.common.Serde<R> outputSerde, T parameter)
Invoke another Restate service method.- Parameters:
target- the address of the calleeinputSerde- Input serdeoutputSerde- Output serdeparameter- the invocation request parameter.- Returns:
- an
Awaitablethat wraps the Restate service method result.
-
call
default Awaitable<byte[]> call(dev.restate.sdk.common.Target target, byte[] parameter)
Likecall(Target, Serde, Serde, Object)with raw input/output.
-
send
<T> void send(dev.restate.sdk.common.Target target, dev.restate.sdk.common.Serde<T> inputSerde, T parameter)Invoke another Restate service without waiting for the response.- Parameters:
target- the address of the calleeinputSerde- Input serdeparameter- the invocation request parameter.
-
send
default void send(dev.restate.sdk.common.Target target, byte[] parameter)Likesend(Target, Serde, Object)with bytes input.
-
send
<T> void send(dev.restate.sdk.common.Target target, dev.restate.sdk.common.Serde<T> inputSerde, T parameter, java.time.Duration delay)Invoke another Restate service without waiting for the response after the provideddelayhas elapsed.This method returns immediately, as the timer is executed and awaited on Restate.
- Parameters:
target- the address of the calleeinputSerde- Input serdeparameter- the invocation request parameter.delay- time to wait before executing the call.
-
send
default void send(dev.restate.sdk.common.Target target, byte[] parameter, java.time.Duration delay)Likesend(Target, Serde, Object, Duration)with bytes input.
-
sleep
default void sleep(java.time.Duration duration)
Causes the current execution of the function invocation to sleep for the given duration.- Parameters:
duration- for which to sleep.
-
timer
Awaitable<java.lang.Void> timer(java.time.Duration duration)
Causes the start of a timer for the given duration. You can await on the timer end by invokingAwaitable.await().- Parameters:
duration- for which to sleep.
-
run
<T> T run(java.lang.String name, dev.restate.sdk.common.Serde<T> serde, dev.restate.sdk.common.function.ThrowingSupplier<T> action) throws dev.restate.sdk.common.TerminalExceptionExecute a non-deterministic closure, recording the result value in the journal. The result value will be re-played in case of re-invocation (e.g. because of failure recovery or suspension point) without re-executing the closure. Use this feature if you want to perform non-deterministic operations.You can name this closure using the
nameparameter. This name will be available in the observability tools.The closure should tolerate retries, that is Restate might re-execute the closure multiple times until it records a result.
Error handling
Errors occurring within this closure won't be propagated to the caller, unless they areTerminalException. Consider the following code:
To propagate run failures to the call-site, make sure to wrap them in// Bad usage of try-catch outside the run try { ctx.run(() -> { throw new IllegalStateException(); }); } catch (IllegalStateException e) { // This will never be executed, // but the error will be retried by Restate, // following the invocation retry policy. } // Good usage of try-catch outside the run try { ctx.run(() -> { throw new TerminalException("my error"); }); } catch (TerminalException e) { // This is invoked }TerminalException.- Type Parameters:
T- type of the return value.- Parameters:
name- name of the side effect.serde- the type tag of the return value, used to serialize/deserialize it.action- closure to execute.- Returns:
- value of the run operation.
- Throws:
dev.restate.sdk.common.TerminalException
-
run
default void run(java.lang.String name, dev.restate.sdk.common.function.ThrowingRunnable runnable) throws dev.restate.sdk.common.TerminalExceptionLikerun(String, Serde, ThrowingSupplier), but without returning a value.- Throws:
dev.restate.sdk.common.TerminalException
-
run
default <T> T run(dev.restate.sdk.common.Serde<T> serde, dev.restate.sdk.common.function.ThrowingSupplier<T> action) throws dev.restate.sdk.common.TerminalExceptionLikerun(String, Serde, ThrowingSupplier), but without a name.- Throws:
dev.restate.sdk.common.TerminalException
-
run
default void run(dev.restate.sdk.common.function.ThrowingRunnable runnable) throws dev.restate.sdk.common.TerminalExceptionLikerun(String, ThrowingRunnable), but without a name.- Throws:
dev.restate.sdk.common.TerminalException
-
awakeable
<T> Awakeable<T> awakeable(dev.restate.sdk.common.Serde<T> serde)
Create anAwakeable, addressable throughAwakeable.id().You can use this feature to implement external asynchronous systems interactions, for example you can send a Kafka record including the
Awakeable.id(), and then let another service consume from Kafka the responses of given external system interaction by usingawakeableHandle(String).
-
awakeableHandle
AwakeableHandle awakeableHandle(java.lang.String id)
Create a newAwakeableHandlefor the provided identifier. You can use it toAwakeableHandle.resolve(Serde, Object)orAwakeableHandle.reject(String)the linkedAwakeable.- See Also:
Awakeable
-
random
RestateRandom random()
- See Also:
RestateRandom
-
-