Skip to content

Commit 4bfdba9

Browse files
committed
Tinkering
1 parent 17adffb commit 4bfdba9

File tree

9 files changed

+81
-55
lines changed

9 files changed

+81
-55
lines changed

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## Entity pattern
22

3-
The handler worker starts a single `GreetingWorkflow` on boot with a fixed workflow ID.
3+
The handler worker starts a single `GreetingWorkflow` with a fixed workflow ID.
44
`NexusGreetingServiceImpl` holds that ID and routes every Nexus operation to it. The caller's
55
inputs contain only business data — no workflow IDs.
66

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/caller/CallerStarter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void main(String[] args) {
2424
.setTaskQueue(CallerWorker.TASK_QUEUE)
2525
.build());
2626

27-
List<String> log = workflow.run();
27+
List<String> log = workflow.run("user-1");
2828
log.forEach(System.out::println);
2929
}
3030
}

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/caller/CallerWorkflow.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
@WorkflowInterface
88
public interface CallerWorkflow {
99
@WorkflowMethod
10-
List<String> run();
10+
List<String> run(String userId);
1111
}

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/caller/CallerWorkflowImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,23 @@ public class CallerWorkflowImpl implements CallerWorkflow {
2828
.build());
2929

3030
@Override
31-
public List<String> run() {
31+
public List<String> run(String userId) {
3232
List<String> log = new ArrayList<>();
3333

3434
// 👉 Call a Nexus operation backed by a query against the entity workflow.
3535
NexusGreetingService.GetLanguagesOutput languagesOutput =
36-
greetingService.getLanguages(new NexusGreetingService.GetLanguagesInput(false));
36+
greetingService.getLanguages(new NexusGreetingService.GetLanguagesInput(false, userId));
3737
log.add("Supported languages: " + languagesOutput.getLanguages());
3838
logger.info("Supported languages: {}", languagesOutput.getLanguages());
3939

4040
// 👉 Call a Nexus operation backed by an update against the entity workflow.
4141
Language previousLanguage =
42-
greetingService.setLanguage(new NexusGreetingService.SetLanguageInput(Language.ARABIC));
42+
greetingService.setLanguage(
43+
new NexusGreetingService.SetLanguageInput(Language.ARABIC, userId));
4344

4445
// 👉 Call a Nexus operation backed by a query to confirm the language change.
4546
Language currentLanguage =
46-
greetingService.getLanguage(new NexusGreetingService.GetLanguageInput());
47+
greetingService.getLanguage(new NexusGreetingService.GetLanguageInput(userId));
4748
if (currentLanguage != Language.ARABIC) {
4849
throw ApplicationFailure.newFailure(
4950
"Expected language ARABIC, got " + currentLanguage, "AssertionError");
@@ -53,7 +54,7 @@ public List<String> run() {
5354
logger.info("Language changed from {} to {}", previousLanguage, Language.ARABIC);
5455

5556
// 👉 Call a Nexus operation backed by a signal against the entity workflow.
56-
greetingService.approve(new NexusGreetingService.ApproveInput("caller"));
57+
greetingService.approve(new NexusGreetingService.ApproveInput("caller", userId));
5758
log.add("Workflow approved");
5859
logger.info("Workflow approved");
5960

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/handler/GreetingWorkflow.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package io.temporal.samples.nexus_messaging.callerpattern.handler;
22

3-
import com.fasterxml.jackson.annotation.JsonCreator;
4-
import com.fasterxml.jackson.annotation.JsonProperty;
53
import io.temporal.samples.nexus_messaging.callerpattern.service.Language;
64
import io.temporal.samples.nexus_messaging.callerpattern.service.NexusGreetingService;
75
import io.temporal.workflow.QueryMethod;
@@ -19,20 +17,6 @@
1917
@WorkflowInterface
2018
public interface GreetingWorkflow {
2119

22-
class ApproveInput {
23-
private final String name;
24-
25-
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
26-
public ApproveInput(@JsonProperty("name") String name) {
27-
this.name = name;
28-
}
29-
30-
@JsonProperty("name")
31-
public String getName() {
32-
return name;
33-
}
34-
}
35-
3620
@WorkflowMethod
3721
String run();
3822

@@ -47,7 +31,7 @@ NexusGreetingService.GetLanguagesOutput getLanguages(
4731

4832
// Approves the workflow, allowing it to complete.
4933
@SignalMethod
50-
void approve(ApproveInput input);
34+
void approve(NexusGreetingService.ApproveInput input);
5135

5236
// Changes the active language synchronously (only supports languages already in the greetings
5337
// map).

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/handler/GreetingWorkflowImpl.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,28 @@ public Language getLanguage() {
5858
}
5959

6060
@Override
61-
public void approve(ApproveInput input) {
62-
logger.info("Approval signal received");
61+
public void approve(NexusGreetingService.ApproveInput input) {
62+
logger.info(
63+
"Approval signal received for workflow {}",
64+
NexusGreetingServiceImpl.getWorkflowId(input.getUserId()));
6365
approvedForRelease = true;
6466
}
6567

6668
@Override
6769
public Language setLanguage(NexusGreetingService.SetLanguageInput input) {
68-
logger.info("setLanguage update received");
70+
logger.info(
71+
"setLanguage update received for workflow {}",
72+
NexusGreetingServiceImpl.getWorkflowId(input.getUserId()));
6973
Language previous = language;
7074
language = input.getLanguage();
7175
return previous;
7276
}
7377

7478
@Override
7579
public void validateSetLanguage(NexusGreetingService.SetLanguageInput input) {
76-
logger.info("validateSetLanguage called");
80+
logger.info(
81+
"validateSetLanguage called for workflow {}",
82+
NexusGreetingServiceImpl.getWorkflowId(input.getUserId()));
7783
if (!greetings.containsKey(input.getLanguage())) {
7884
throw new IllegalArgumentException(input.getLanguage().name() + " is not supported");
7985
}

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/handler/HandlerWorker.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class HandlerWorker {
1515

1616
public static final String NAMESPACE = "nexus-messaging-handler-namespace";
1717
public static final String TASK_QUEUE = "nexus-messaging-handler-task-queue";
18-
static final String WORKFLOW_ID = "nexus-messaging-greeting-workflow";
18+
static final String USER_ID = "user-1";
1919

2020
public static void main(String[] args) throws InterruptedException {
2121
WorkflowServiceStubs service = WorkflowServiceStubs.newLocalServiceStubs();
@@ -24,25 +24,28 @@ public static void main(String[] args) throws InterruptedException {
2424
service, WorkflowClientOptions.newBuilder().setNamespace(NAMESPACE).build());
2525

2626
// Start the long-running entity workflow that backs the Nexus service, if not already running.
27+
// The workflow ID is derived from the user ID using the same prefix as
28+
// NexusGreetingServiceImpl.
29+
String workflowId = NexusGreetingServiceImpl.getWorkflowId(USER_ID);
2730
GreetingWorkflow greetingWorkflow =
2831
client.newWorkflowStub(
2932
GreetingWorkflow.class,
3033
WorkflowOptions.newBuilder()
31-
.setWorkflowId(WORKFLOW_ID)
34+
.setWorkflowId(workflowId)
3235
.setTaskQueue(TASK_QUEUE)
3336
.build());
3437
try {
3538
WorkflowClient.start(greetingWorkflow::run);
36-
logger.info("Started greeting workflow: {}", WORKFLOW_ID);
39+
logger.info("Started greeting workflow: {}", workflowId);
3740
} catch (WorkflowExecutionAlreadyStarted e) {
38-
logger.info("Greeting workflow already running: {}", WORKFLOW_ID);
41+
logger.info("Greeting workflow already running: {}", workflowId);
3942
}
4043

4144
WorkerFactory factory = WorkerFactory.newInstance(client);
4245
Worker worker = factory.newWorker(TASK_QUEUE);
4346
worker.registerWorkflowImplementationTypes(GreetingWorkflowImpl.class);
4447
worker.registerActivitiesImplementations(new GreetingActivityImpl());
45-
worker.registerNexusServiceImplementation(new NexusGreetingServiceImpl(WORKFLOW_ID));
48+
worker.registerNexusServiceImplementation(new NexusGreetingServiceImpl());
4649

4750
factory.start();
4851
logger.info("Handler worker started, ctrl+c to exit");

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/handler/NexusGreetingServiceImpl.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,25 @@
1010
import org.slf4j.LoggerFactory;
1111

1212
/**
13-
* Nexus operation handler implementation. Each operation is backed by the long-running
14-
* GreetingWorkflow entity. The operations are synchronous (sync_operation) because queries and
13+
* Nexus operation handler implementation. Each operation receives a userId, which is mapped to a
14+
* workflow ID using {@link #WORKFLOW_ID_PREFIX}. The operations are synchronous because queries and
1515
* updates against a running workflow complete quickly.
1616
*/
1717
@ServiceImpl(service = NexusGreetingService.class)
1818
public class NexusGreetingServiceImpl {
1919

2020
private static final Logger logger = LoggerFactory.getLogger(NexusGreetingServiceImpl.class);
2121

22-
private final String workflowId;
22+
static final String WORKFLOW_ID_PREFIX = "GreetingWorkflow_for_";
2323

24-
public NexusGreetingServiceImpl(String workflowId) {
25-
this.workflowId = workflowId;
24+
public static String getWorkflowId(String userId) {
25+
return WORKFLOW_ID_PREFIX + userId;
2626
}
2727

28-
private GreetingWorkflow getWorkflowStub() {
28+
private GreetingWorkflow getWorkflowStub(String userId) {
2929
return Nexus.getOperationContext()
3030
.getWorkflowClient()
31-
.newWorkflowStub(GreetingWorkflow.class, workflowId);
31+
.newWorkflowStub(GreetingWorkflow.class, getWorkflowId(userId));
3232
}
3333

3434
@OperationImpl
@@ -37,17 +37,17 @@ private GreetingWorkflow getWorkflowStub() {
3737
getLanguages() {
3838
return OperationHandler.sync(
3939
(ctx, details, input) -> {
40-
logger.info("Query for GetLanguages was received");
41-
return getWorkflowStub().getLanguages(input);
40+
logger.info("Query for GetLanguages was received for user {}", input.getUserId());
41+
return getWorkflowStub(input.getUserId()).getLanguages(input);
4242
});
4343
}
4444

4545
@OperationImpl
4646
public OperationHandler<NexusGreetingService.GetLanguageInput, Language> getLanguage() {
4747
return OperationHandler.sync(
4848
(ctx, details, input) -> {
49-
logger.info("Query for GetLanguage was received");
50-
return getWorkflowStub().getLanguage();
49+
logger.info("Query for GetLanguage was received for user {}", input.getUserId());
50+
return getWorkflowStub(input.getUserId()).getLanguage();
5151
});
5252
}
5353

@@ -57,8 +57,8 @@ public OperationHandler<NexusGreetingService.GetLanguageInput, Language> getLang
5757
public OperationHandler<NexusGreetingService.SetLanguageInput, Language> setLanguage() {
5858
return OperationHandler.sync(
5959
(ctx, details, input) -> {
60-
logger.info("Update for SetLanguage was received");
61-
return getWorkflowStub().setLanguageUsingActivity(input);
60+
logger.info("Update for SetLanguage was received for user {}", input.getUserId());
61+
return getWorkflowStub(input.getUserId()).setLanguageUsingActivity(input);
6262
});
6363
}
6464

@@ -67,8 +67,8 @@ public OperationHandler<NexusGreetingService.SetLanguageInput, Language> setLang
6767
approve() {
6868
return OperationHandler.sync(
6969
(ctx, details, input) -> {
70-
logger.info("Signal for Approve was received");
71-
getWorkflowStub().approve(new GreetingWorkflow.ApproveInput(input.getName()));
70+
logger.info("Signal for Approve was received for user {}", input.getUserId());
71+
getWorkflowStub(input.getUserId()).approve(input);
7272
return new NexusGreetingService.ApproveOutput();
7373
});
7474
}

core/src/main/java/io/temporal/samples/nexus_messaging/callerpattern/service/NexusGreetingService.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,25 @@ public interface NexusGreetingService {
1616

1717
class GetLanguagesInput {
1818
private final boolean includeUnsupported;
19+
private final String userId;
1920

2021
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
21-
public GetLanguagesInput(@JsonProperty("includeUnsupported") boolean includeUnsupported) {
22+
public GetLanguagesInput(
23+
@JsonProperty("includeUnsupported") boolean includeUnsupported,
24+
@JsonProperty("userId") String userId) {
2225
this.includeUnsupported = includeUnsupported;
26+
this.userId = userId;
2327
}
2428

2529
@JsonProperty("includeUnsupported")
2630
public boolean isIncludeUnsupported() {
2731
return includeUnsupported;
2832
}
33+
34+
@JsonProperty("userId")
35+
public String getUserId() {
36+
return userId;
37+
}
2938
}
3039

3140
class GetLanguagesOutput {
@@ -42,24 +51,39 @@ public List<Language> getLanguages() {
4251
}
4352
}
4453

45-
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
4654
class GetLanguageInput {
47-
@JsonCreator
48-
public GetLanguageInput() {}
55+
private final String userId;
56+
57+
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
58+
public GetLanguageInput(@JsonProperty("userId") String userId) {
59+
this.userId = userId;
60+
}
61+
62+
@JsonProperty("userId")
63+
public String getUserId() {
64+
return userId;
65+
}
4966
}
5067

5168
class ApproveInput {
5269
private final String name;
70+
private final String userId;
5371

5472
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
55-
public ApproveInput(@JsonProperty("name") String name) {
73+
public ApproveInput(@JsonProperty("name") String name, @JsonProperty("userId") String userId) {
5674
this.name = name;
75+
this.userId = userId;
5776
}
5877

5978
@JsonProperty("name")
6079
public String getName() {
6180
return name;
6281
}
82+
83+
@JsonProperty("userId")
84+
public String getUserId() {
85+
return userId;
86+
}
6387
}
6488

6589
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
@@ -70,16 +94,24 @@ public ApproveOutput() {}
7094

7195
class SetLanguageInput {
7296
private final Language language;
97+
private final String userId;
7398

7499
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
75-
public SetLanguageInput(@JsonProperty("language") Language language) {
100+
public SetLanguageInput(
101+
@JsonProperty("language") Language language, @JsonProperty("userId") String userId) {
76102
this.language = language;
103+
this.userId = userId;
77104
}
78105

79106
@JsonProperty("language")
80107
public Language getLanguage() {
81108
return language;
82109
}
110+
111+
@JsonProperty("userId")
112+
public String getUserId() {
113+
return userId;
114+
}
83115
}
84116

85117
// Returns the languages supported by the greeting workflow.

0 commit comments

Comments
 (0)