ClientServiceHandle

@ApiStatus.Experimental
interface ClientServiceHandle<SVC>

EXPERIMENTAL API: This interface is part of the new reflection-based API and may change in future releases.

Advanced API handle for invoking Restate services, virtual objects, or workflows from the ingress (outside of a handler). This handle provides advanced invocation capabilities including:

  • Async request handling with CompletableFuture
  • Invocation options such as idempotency keys
  • Fire-and-forget requests via send()
  • Access to full Response metadata

Use this handle to perform requests with method references:


Client client = Client.connect("http://localhost:8080");

// 1. Use call() with method reference and wait for the result
Response<GreetingResponse> response = client.serviceHandle(Greeter.class)
  .call(Greeter::greet, new Greeting("Alice"));

// 2. Use send() for one-way invocation without waiting
SendResponse<GreetingResponse> sendResponse = client.serviceHandle(Greeter.class)
  .send(Greeter::greet, new Greeting("Alice"));

Create instances using serviceHandle, virtualObjectHandle, or workflowHandle.

For simple synchronous request-response interactions returning just the output, consider using the simple proxy API instead: service, virtualObject, or workflow.

Parameters

<SVC>

the service interface type

Functions

Link copied to clipboard
@ApiStatus.Experimental
open fun call(s: Consumer<SVC>): Response<Void>
@ApiStatus.Experimental
open fun <O> call(s: (SVC) -> O): Response<O>
@ApiStatus.Experimental
open fun <I> call(s: BiConsumer<SVC, I>, input: I): Response<Void>
@ApiStatus.Experimental
open fun call(s: Consumer<SVC>, invocationOptions: InvocationOptions): Response<Void>
@ApiStatus.Experimental
open fun call(s: Consumer<SVC>, options: InvocationOptions.Builder): Response<Void>
@ApiStatus.Experimental
open fun <O> call(s: (SVC) -> O, invocationOptions: InvocationOptions): Response<O>
@ApiStatus.Experimental
open fun <O> call(s: (SVC) -> O, options: InvocationOptions.Builder): Response<O>
@ApiStatus.Experimental
open fun <I> call(s: BiConsumer<SVC, I>, input: I, invocationOptions: InvocationOptions): Response<Void>
@ApiStatus.Experimental
open fun <I> call(s: BiConsumer<SVC, I>, input: I, options: InvocationOptions.Builder): Response<Void>
@ApiStatus.Experimental
open fun <I, O> call(s: BiFunction<SVC, I, O>, input: I, invocationOptions: InvocationOptions): Response<O>
@ApiStatus.Experimental
open fun <I, O> call(s: BiFunction<SVC, I, O>, input: I, options: InvocationOptions.Builder): Response<O>

@ApiStatus.Experimental
open fun <I, O> call(s: BiFunction<SVC, I, O>, input: I): Response<O>
EXPERIMENTAL API: Invoke a service method with input and wait for the response.
Link copied to clipboard
@ApiStatus.Experimental
open fun callAsync(s: Consumer<SVC>): CompletableFuture<Response<Void>>
@ApiStatus.Experimental
open fun <O> callAsync(s: (SVC) -> O): CompletableFuture<Response<O>>
@ApiStatus.Experimental
open fun <I> callAsync(s: BiConsumer<SVC, I>, input: I): CompletableFuture<Response<Void>>
@ApiStatus.Experimental
open fun <I, O> callAsync(s: BiFunction<SVC, I, O>, input: I): CompletableFuture<Response<O>>
@ApiStatus.Experimental
abstract fun callAsync(s: Consumer<SVC>, invocationOptions: InvocationOptions): CompletableFuture<Response<Void>>
@ApiStatus.Experimental
open fun callAsync(s: Consumer<SVC>, options: InvocationOptions.Builder): CompletableFuture<Response<Void>>
@ApiStatus.Experimental
abstract fun <O> callAsync(s: (SVC) -> O, invocationOptions: InvocationOptions): CompletableFuture<Response<O>>
@ApiStatus.Experimental
open fun <O> callAsync(s: (SVC) -> O, options: InvocationOptions.Builder): CompletableFuture<Response<O>>
@ApiStatus.Experimental
abstract fun <I> callAsync(s: BiConsumer<SVC, I>, input: I, invocationOptions: InvocationOptions): CompletableFuture<Response<Void>>
@ApiStatus.Experimental
open fun <I> callAsync(s: BiConsumer<SVC, I>, input: I, options: InvocationOptions.Builder): CompletableFuture<Response<Void>>
@ApiStatus.Experimental
abstract fun <I, O> callAsync(s: BiFunction<SVC, I, O>, input: I, invocationOptions: InvocationOptions): CompletableFuture<Response<O>>
@ApiStatus.Experimental
open fun <I, O> callAsync(s: BiFunction<SVC, I, O>, input: I, options: InvocationOptions.Builder): CompletableFuture<Response<O>>
Link copied to clipboard
@ApiStatus.Experimental
open fun send(s: Consumer<SVC>): SendResponse<Void>
EXPERIMENTAL API: Like send, for methods without input or return value.
@ApiStatus.Experimental
open fun <O> send(s: (SVC) -> O): SendResponse<O>
EXPERIMENTAL API: Like send, for methods without input.
@ApiStatus.Experimental
open fun <I> send(s: BiConsumer<SVC, I>, input: I): SendResponse<Void>
EXPERIMENTAL API: Like send, for methods without a return value.
@ApiStatus.Experimental
open fun <I, O> send(s: BiFunction<SVC, I, O>, input: I): SendResponse<O>
EXPERIMENTAL API: Send a one-way invocation without waiting for the response.
@ApiStatus.Experimental
open fun send(s: Consumer<SVC>, invocationOptions: InvocationOptions): SendResponse<Void>
@ApiStatus.Experimental
open fun send(s: Consumer<SVC>, options: InvocationOptions.Builder): SendResponse<Void>
@ApiStatus.Experimental
open fun <O> send(s: (SVC) -> O, invocationOptions: InvocationOptions): SendResponse<O>
@ApiStatus.Experimental
open fun <O> send(s: (SVC) -> O, options: InvocationOptions.Builder): SendResponse<O>
@ApiStatus.Experimental
open fun <I> send(s: BiConsumer<SVC, I>, input: I, invocationOptions: InvocationOptions): SendResponse<Void>
@ApiStatus.Experimental
open fun <I> send(s: BiConsumer<SVC, I>, input: I, options: InvocationOptions.Builder): SendResponse<Void>
@ApiStatus.Experimental
open fun <I, O> send(s: BiFunction<SVC, I, O>, input: I, invocationOptions: InvocationOptions): SendResponse<O>
@ApiStatus.Experimental
open fun <I, O> send(s: BiFunction<SVC, I, O>, input: I, options: InvocationOptions.Builder): SendResponse<O>
EXPERIMENTAL API: Like send, with invocation options.
@ApiStatus.Experimental
open fun send(s: Consumer<SVC>, delay: Duration): SendResponse<Void>
@ApiStatus.Experimental
open fun <O> send(s: (SVC) -> O, delay: Duration): SendResponse<O>
@ApiStatus.Experimental
open fun <I> send(s: BiConsumer<SVC, I>, input: I, delay: Duration): SendResponse<Void>
@ApiStatus.Experimental
open fun <I, O> send(s: BiFunction<SVC, I, O>, input: I, delay: Duration): SendResponse<O>
EXPERIMENTAL API: Like send, with a delay.
@ApiStatus.Experimental
open fun send(s: Consumer<SVC>, delay: Duration, invocationOptions: InvocationOptions): SendResponse<Void>
@ApiStatus.Experimental
open fun send(s: Consumer<SVC>, delay: Duration, options: InvocationOptions.Builder): SendResponse<Void>
@ApiStatus.Experimental
open fun <O> send(s: (SVC) -> O, delay: Duration, invocationOptions: InvocationOptions): SendResponse<O>
@ApiStatus.Experimental
open fun <O> send(s: (SVC) -> O, delay: Duration, options: InvocationOptions.Builder): SendResponse<O>
@ApiStatus.Experimental
open fun <I> send(s: BiConsumer<SVC, I>, input: I, delay: Duration, invocationOptions: InvocationOptions): SendResponse<Void>
@ApiStatus.Experimental
open fun <I> send(s: BiConsumer<SVC, I>, input: I, delay: Duration, options: InvocationOptions.Builder): SendResponse<Void>
@ApiStatus.Experimental
open fun <I, O> send(s: BiFunction<SVC, I, O>, input: I, delay: Duration, invocationOptions: InvocationOptions): SendResponse<O>
@ApiStatus.Experimental
open fun <I, O> send(s: BiFunction<SVC, I, O>, input: I, delay: Duration, options: InvocationOptions.Builder): SendResponse<O>
EXPERIMENTAL API: Like send, with a delay and invocation options.
Link copied to clipboard
@ApiStatus.Experimental
open fun sendAsync(s: Consumer<SVC>): CompletableFuture<SendResponse<Void>>
EXPERIMENTAL API: Like sendAsync, for no-input/void methods.
@ApiStatus.Experimental
open fun <O> sendAsync(s: (SVC) -> O): CompletableFuture<SendResponse<O>>
EXPERIMENTAL API: Like sendAsync, for no-input methods.
@ApiStatus.Experimental
open fun <I> sendAsync(s: BiConsumer<SVC, I>, input: I): CompletableFuture<SendResponse<Void>>
EXPERIMENTAL API: Like sendAsync, for void methods.
@ApiStatus.Experimental
open fun <I, O> sendAsync(s: BiFunction<SVC, I, O>, input: I): CompletableFuture<SendResponse<O>>
EXPERIMENTAL API: Async version of send.
@ApiStatus.Experimental
open fun sendAsync(s: Consumer<SVC>, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun sendAsync(s: Consumer<SVC>, options: InvocationOptions.Builder): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun <O> sendAsync(s: (SVC) -> O, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
open fun <O> sendAsync(s: (SVC) -> O, options: InvocationOptions.Builder): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
open fun <I> sendAsync(s: BiConsumer<SVC, I>, input: I, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun <I> sendAsync(s: BiConsumer<SVC, I>, input: I, options: InvocationOptions.Builder): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun <I, O> sendAsync(s: BiFunction<SVC, I, O>, input: I, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
open fun <I, O> sendAsync(s: BiFunction<SVC, I, O>, input: I, options: InvocationOptions.Builder): CompletableFuture<SendResponse<O>>
EXPERIMENTAL API: Like sendAsync, with options.
@ApiStatus.Experimental
open fun sendAsync(s: Consumer<SVC>, delay: Duration): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun <O> sendAsync(s: (SVC) -> O, delay: Duration): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
open fun <I> sendAsync(s: BiConsumer<SVC, I>, input: I, delay: Duration): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun <I, O> sendAsync(s: BiFunction<SVC, I, O>, input: I, delay: Duration): CompletableFuture<SendResponse<O>>
EXPERIMENTAL API: Like sendAsync, with a delay.
@ApiStatus.Experimental
abstract fun sendAsync(s: Consumer<SVC>, delay: Duration, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun sendAsync(s: Consumer<SVC>, delay: Duration, options: InvocationOptions.Builder): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
abstract fun <O> sendAsync(s: (SVC) -> O, delay: Duration, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
open fun <O> sendAsync(s: (SVC) -> O, delay: Duration, options: InvocationOptions.Builder): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
abstract fun <I> sendAsync(s: BiConsumer<SVC, I>, input: I, delay: Duration, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
open fun <I> sendAsync(s: BiConsumer<SVC, I>, input: I, delay: Duration, options: InvocationOptions.Builder): CompletableFuture<SendResponse<Void>>
@ApiStatus.Experimental
abstract fun <I, O> sendAsync(s: BiFunction<SVC, I, O>, input: I, delay: Duration, invocationOptions: InvocationOptions): CompletableFuture<SendResponse<O>>
@ApiStatus.Experimental
open fun <I, O> sendAsync(s: BiFunction<SVC, I, O>, input: I, delay: Duration, options: InvocationOptions.Builder): CompletableFuture<SendResponse<O>>
EXPERIMENTAL API: Like sendAsync, with delay and options.