Skip to content

Commit 0052e5e

Browse files
committed
Progress checkin
1 parent 1e493f0 commit 0052e5e

9 files changed

Lines changed: 406 additions & 175 deletions

File tree

temporal-sdk/src/main/java/io/temporal/client/NexusClient.java

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,19 @@
22

33
import io.temporal.client.NexusClientInterceptor.CountNexusOperationExecutionsInput;
44
import io.temporal.client.NexusClientInterceptor.CountNexusOperationExecutionsOutput;
5-
import io.temporal.client.NexusClientInterceptor.DeleteNexusOperationExecutionInput;
6-
import io.temporal.client.NexusClientInterceptor.DescribeNexusOperationExecutionInput;
7-
import io.temporal.client.NexusClientInterceptor.DescribeNexusOperationExecutionOutput;
85
import io.temporal.client.NexusClientInterceptor.ListNexusOperationExecutionsInput;
96
import io.temporal.client.NexusClientInterceptor.ListNexusOperationExecutionsOutput;
10-
import io.temporal.client.NexusClientInterceptor.PollNexusOperationExecutionInput;
11-
import io.temporal.client.NexusClientInterceptor.PollNexusOperationExecutionOutput;
12-
import io.temporal.client.NexusClientInterceptor.RequestCancelNexusOperationExecutionInput;
137
import io.temporal.client.NexusClientInterceptor.StartNexusOperationExecutionInput;
148
import io.temporal.client.NexusClientInterceptor.StartNexusOperationExecutionOutput;
15-
import io.temporal.client.NexusClientInterceptor.TerminateNexusOperationExecutionInput;
169
import io.temporal.common.Experimental;
1710
import io.temporal.serviceclient.WorkflowServiceStubs;
18-
import java.lang.reflect.Type;
19-
import java.util.concurrent.CompletableFuture;
2011
import javax.annotation.Nullable;
2112

2213
/**
23-
* Handle for interacting with a standalone Nexus operation execution.
14+
* Client for managing standalone Nexus operation executions.
2415
*
25-
* <p>Returned by {@link WorkflowClient} when starting a Nexus operation, and also constructable
26-
* from an existing operation ID for operating on an operation that was started elsewhere.
16+
* <p>Per-operation actions (describe, cancel, terminate, delete, get result) live on {@link
17+
* NexusClientHandle}; obtain a handle via {@link #getHandle}.
2718
*/
2819
@Experimental
2920
public interface NexusClient {
@@ -36,49 +27,25 @@ static NexusClient newInstance(
3627
return NexusClientImpl.newInstance(service, options);
3728
}
3829

39-
NexusClientHandle getHandle(String scheduleID);
30+
/** Obtain a handle to an existing operation; targets the latest run. */
31+
NexusClientHandle getHandle(String operationId);
4032

41-
UntypedNexusClientHandle getHandle(String operationId, @Nullable String operationRunId);
42-
43-
/** Obtains typed handle to existing operations. */
44-
<R> NexusClientHandle<R> getHandle(
45-
String operationId, @Nullable String operationRunId, Class<R> resultClass);
46-
47-
/** Obtains typed handle to existing operations. For use with generic return types. */
48-
<R> NexusClientHandle<R> getHandle(
49-
String operationId,
50-
@Nullable String operationRunId,
51-
Class<R> resultClass,
52-
@Nullable Type resultType);
33+
/** Obtain a handle to an existing operation, optionally pinned to a specific run. */
34+
NexusClientHandle getHandle(String operationId, @Nullable String runId);
5335

5436
UntypedNexusServiceClient newUntypeNexusServiceClient();
5537

5638
<R> NexusServiceClient<R> newNexusServiceClient();
5739

40+
/** Start a new standalone Nexus operation execution. */
5841
StartNexusOperationExecutionOutput startNexusOperationExecution(
5942
StartNexusOperationExecutionInput input);
6043

61-
DescribeNexusOperationExecutionOutput describeNexusOperationExecution(
62-
DescribeNexusOperationExecutionInput input);
63-
64-
CompletableFuture<DescribeNexusOperationExecutionOutput> describeNexusOperationExecutionAsync(
65-
DescribeNexusOperationExecutionInput input);
66-
67-
PollNexusOperationExecutionOutput pollNexusOperationExecution(
68-
PollNexusOperationExecutionInput input);
69-
70-
CompletableFuture<PollNexusOperationExecutionOutput> pollNexusOperationExecutionAsync(
71-
PollNexusOperationExecutionInput input);
72-
44+
/** List standalone Nexus operation executions matching a query. */
7345
ListNexusOperationExecutionsOutput listNexusOperationExecutions(
7446
ListNexusOperationExecutionsInput input);
7547

48+
/** Count standalone Nexus operation executions matching a query. */
7649
CountNexusOperationExecutionsOutput countNexusOperationExecutions(
7750
CountNexusOperationExecutionsInput input);
78-
79-
void requestCancelNexusOperationExecution(RequestCancelNexusOperationExecutionInput input);
80-
81-
void terminateNexusOperationExecution(TerminateNexusOperationExecutionInput input);
82-
83-
void deleteNexusOperationExecution(DeleteNexusOperationExecutionInput input);
8451
}

temporal-sdk/src/main/java/io/temporal/client/NexusClientHandle.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,39 @@
44
import java.util.concurrent.CompletableFuture;
55
import javax.annotation.Nullable;
66

7-
public interface NexusClientHandle<R> extends UntypedNexusClientHandle {
8-
public <R> NexusClientHandle<R> fromUntyped(
9-
UntypedNexusClientHandle handle, Class<R> resultClass);
7+
/**
8+
* Handle for interacting with an existing standalone Nexus operation execution. Returned by {@link
9+
* NexusClient#getHandle(String)} (and overloads).
10+
*/
11+
public interface NexusClientHandle {
12+
/** Operation ID this handle was constructed for. Always non-null. */
13+
String getNexusOperationId();
1014

11-
public <R> NexusClientHandle<R> fromUntyped(
12-
UntypedNexusClientHandle handle, Class<R> resultClass, @Nullable Type resultType);
15+
/**
16+
* Present if the handle was returned by start or set when calling {@link
17+
* NexusClient#getHandle(String, String)}. Null if no run ID was provided — call {@link
18+
* #describe()} to learn the current run ID.
19+
*/
20+
@Nullable
21+
String getNexusOperationRunId();
1322

14-
public R getResult();
23+
NexusClientOperationExecutionDescription describe();
1524

16-
public CompletableFuture<R> getResultAsync();
25+
void cancel();
26+
27+
void cancel(@Nullable String reason);
28+
29+
void terminate();
30+
31+
void terminate(@Nullable String reason);
32+
33+
void delete();
34+
35+
<R> R getResult(Class<R> resultClass);
36+
37+
<R> R getResult(Class<R> resultClass, @Nullable Type resultType);
38+
39+
<R> CompletableFuture<R> getResultAsync(Class<R> resultClass);
40+
41+
<R> CompletableFuture<R> getResultAsync(Class<R> resultClass, @Nullable Type resultType);
1742
}
Lines changed: 76 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,117 @@
11
package io.temporal.client;
22

3+
import io.grpc.Deadline;
4+
import io.temporal.client.NexusClientInterceptor.DeleteNexusOperationExecutionInput;
5+
import io.temporal.client.NexusClientInterceptor.DescribeNexusOperationExecutionInput;
6+
import io.temporal.client.NexusClientInterceptor.DescribeNexusOperationExecutionOutput;
7+
import io.temporal.client.NexusClientInterceptor.RequestCancelNexusOperationExecutionInput;
8+
import io.temporal.client.NexusClientInterceptor.TerminateNexusOperationExecutionInput;
39
import java.lang.reflect.Type;
410
import java.util.concurrent.CompletableFuture;
11+
import java.util.concurrent.TimeUnit;
512
import javax.annotation.Nullable;
613

7-
public class NexusClientHandleImpl<R> implements NexusClientHandle<R> {
14+
public class NexusClientHandleImpl implements NexusClientHandle {
815

9-
private final NexusClientInterceptor interceptor;
16+
// Default deadline applied to per-handle RPCs that need one (describe). Long-poll callers
17+
// should reach for a typed result API once it exists, which can take a caller-supplied
18+
// deadline.
19+
private static final long DEFAULT_DEADLINE_SECONDS = 30;
1020

11-
public NexusClientHandleImpl(NexusClientInterceptor interceptor) {
21+
private final NexusClientInterceptor interceptor;
22+
private final String operationId;
23+
private final @Nullable String runId;
24+
25+
public NexusClientHandleImpl(
26+
NexusClientInterceptor interceptor, String operationId, @Nullable String runId) {
27+
if (interceptor == null) {
28+
throw new IllegalArgumentException("interceptor is required");
29+
}
30+
if (operationId == null) {
31+
throw new IllegalArgumentException("operationId is required");
32+
}
1233
this.interceptor = interceptor;
34+
this.operationId = operationId;
35+
this.runId = runId;
1336
}
1437

15-
public <T> NexusClientHandle<T> fromUntyped(
16-
UntypedNexusClientHandle handle, Class<T> resultClass) {
17-
return null;
18-
}
19-
20-
public <T> NexusClientHandle<T> fromUntyped(
21-
UntypedNexusClientHandle handle, Class<T> resultClass, @Nullable Type resultType) {
22-
return null;
23-
}
24-
25-
public R getResult() {
26-
return null;
38+
@Override
39+
public String getNexusOperationId() {
40+
return operationId;
2741
}
2842

29-
public CompletableFuture<R> getResultAsync() {
30-
return null;
43+
@Override
44+
public @Nullable String getNexusOperationRunId() {
45+
return runId;
3146
}
3247

3348
@Override
34-
public @Nullable String getNexusOperationRunId() {
35-
return "";
49+
public NexusClientOperationExecutionDescription describe() {
50+
DescribeNexusOperationExecutionInput input =
51+
new DescribeNexusOperationExecutionInput(
52+
operationId,
53+
runId,
54+
/* includeInput= */ false,
55+
/* includeOutcome= */ true,
56+
Deadline.after(DEFAULT_DEADLINE_SECONDS, TimeUnit.SECONDS));
57+
DescribeNexusOperationExecutionOutput output =
58+
interceptor.describeNexusOperationExecution(input);
59+
return output.getDescription();
3660
}
3761

3862
@Override
39-
public <R> R getResult(Class<R> resultClass) {
40-
return null;
63+
public void cancel() {
64+
cancel(null);
4165
}
4266

4367
@Override
44-
public <R> R getResult(Class<R> resultClass, @Nullable Type resultType) {
45-
return null;
68+
public void cancel(@Nullable String reason) {
69+
interceptor.requestCancelNexusOperationExecution(
70+
new RequestCancelNexusOperationExecutionInput(operationId, runId, reason));
4671
}
4772

4873
@Override
49-
public <R> CompletableFuture<R> getResultAsync(Class<R> resultClass) {
50-
return null;
74+
public void terminate() {
75+
terminate(null);
5176
}
5277

5378
@Override
54-
public <R> CompletableFuture<R> getResultAsync(Class<R> resultClass, @Nullable Type resultType) {
55-
return null;
79+
public void terminate(@Nullable String reason) {
80+
interceptor.terminateNexusOperationExecution(
81+
new TerminateNexusOperationExecutionInput(operationId, runId, reason));
5682
}
5783

5884
@Override
59-
public NexusClientOperationExecutionDescription describe() {
60-
return null;
85+
public void delete() {
86+
interceptor.deleteNexusOperationExecution(
87+
new DeleteNexusOperationExecutionInput(operationId, runId));
6188
}
6289

6390
@Override
64-
public void cancel() {}
91+
public <R> R getResult(Class<R> resultClass) {
92+
throw new UnsupportedOperationException(
93+
"getResult is not yet implemented — pending DataConverter support on NexusClientOperationOptions"
94+
+ " and a poll-until-completion strategy");
95+
}
6596

6697
@Override
67-
public void cancel(@Nullable String reason) {}
98+
public <R> R getResult(Class<R> resultClass, @Nullable Type resultType) {
99+
throw new UnsupportedOperationException(
100+
"getResult is not yet implemented — pending DataConverter support on NexusClientOperationOptions"
101+
+ " and a poll-until-completion strategy");
102+
}
68103

69104
@Override
70-
public void terminate() {}
105+
public <R> CompletableFuture<R> getResultAsync(Class<R> resultClass) {
106+
throw new UnsupportedOperationException(
107+
"getResultAsync is not yet implemented — pending DataConverter support on NexusClientOperationOptions"
108+
+ " and a poll-until-completion strategy");
109+
}
71110

72111
@Override
73-
public void terminate(@Nullable String reason) {}
112+
public <R> CompletableFuture<R> getResultAsync(Class<R> resultClass, @Nullable Type resultType) {
113+
throw new UnsupportedOperationException(
114+
"getResultAsync is not yet implemented — pending DataConverter support on NexusClientOperationOptions"
115+
+ " and a poll-until-completion strategy");
116+
}
74117
}

0 commit comments

Comments
 (0)