Skip to content

Commit 3be060b

Browse files
tsurdilocretz
andauthored
ScheduleClient for SpringBoot (#1816)
* ScheduleClient for SpringBoot Signed-off-by: Tihomir Surdilovic <[email protected]> * Update temporal-spring-boot-autoconfigure-alpha/src/main/java/io/temporal/spring/boot/autoconfigure/RootNamespaceAutoConfiguration.java Co-authored-by: Chad Retz <[email protected]> * create schedule client from template Signed-off-by: Tihomir Surdilovic <[email protected]> --------- Signed-off-by: Tihomir Surdilovic <[email protected]> Co-authored-by: Chad Retz <[email protected]>
1 parent 3bd8206 commit 3be060b

File tree

6 files changed

+86
-12
lines changed

6 files changed

+86
-12
lines changed

temporal-spring-boot-autoconfigure-alpha/src/main/java/io/temporal/spring/boot/autoconfigure/RootNamespaceAutoConfiguration.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import io.opentracing.Tracer;
2424
import io.temporal.client.WorkflowClient;
2525
import io.temporal.client.WorkflowClientOptions;
26+
import io.temporal.client.schedules.ScheduleClient;
27+
import io.temporal.client.schedules.ScheduleClientOptions;
2628
import io.temporal.common.converter.DataConverter;
2729
import io.temporal.serviceclient.WorkflowServiceStubs;
2830
import io.temporal.spring.boot.TemporalOptionsCustomizer;
@@ -86,7 +88,9 @@ public NamespaceTemplate rootNamespaceTemplate(
8688
@Autowired(required = false) @Nullable
8789
TemporalOptionsCustomizer<WorkerOptions.Builder> workerCustomizer,
8890
@Autowired(required = false) @Nullable
89-
TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer) {
91+
TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer,
92+
@Autowired(required = false) @Nullable
93+
TemporalOptionsCustomizer<ScheduleClientOptions.Builder> scheduleCustomize) {
9094
DataConverter chosenDataConverter =
9195
AutoConfigurationUtils.choseDataConverter(dataConverters, mainDataConverter);
9296
return new NamespaceTemplate(
@@ -98,7 +102,8 @@ public NamespaceTemplate rootNamespaceTemplate(
98102
testWorkflowEnvironment,
99103
workerFactoryCustomizer,
100104
workerCustomizer,
101-
clientCustomizer);
105+
clientCustomizer,
106+
scheduleCustomize);
102107
}
103108

104109
/** Client */
@@ -113,6 +118,11 @@ public WorkflowClient client(ClientTemplate clientTemplate) {
113118
return clientTemplate.getWorkflowClient();
114119
}
115120

121+
@Bean(name = "temporalScheduleClient")
122+
public ScheduleClient scheduleClient(ClientTemplate clientTemplate) {
123+
return clientTemplate.getScheduleClient();
124+
}
125+
116126
/** Workers */
117127
@Bean(name = "temporalWorkersTemplate")
118128
@Conditional(WorkersPresentCondition.class)

temporal-spring-boot-autoconfigure-alpha/src/main/java/io/temporal/spring/boot/autoconfigure/TestServerAutoConfiguration.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.uber.m3.tally.Scope;
2424
import io.opentracing.Tracer;
2525
import io.temporal.client.WorkflowClientOptions;
26+
import io.temporal.client.schedules.ScheduleClientOptions;
2627
import io.temporal.common.converter.DataConverter;
2728
import io.temporal.serviceclient.WorkflowServiceStubsOptions;
2829
import io.temporal.spring.boot.TemporalOptionsCustomizer;
@@ -79,6 +80,8 @@ public TestWorkflowEnvironment testWorkflowEnvironment(
7980
TemporalOptionsCustomizer<WorkerFactoryOptions.Builder> workerFactoryCustomizer,
8081
@Autowired(required = false) @Nullable
8182
TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer,
83+
@Autowired(required = false) @Nullable
84+
TemporalOptionsCustomizer<ScheduleClientOptions.Builder> scheduleCustomizer,
8285
@Autowired(required = false) @Nullable
8386
TemporalOptionsCustomizer<WorkflowServiceStubsOptions.Builder>
8487
workflowServiceStubsCustomizer) {
@@ -94,7 +97,11 @@ public TestWorkflowEnvironment testWorkflowEnvironment(
9497
TestEnvironmentOptions.newBuilder()
9598
.setWorkflowClientOptions(
9699
new WorkflowClientOptionsTemplate(
97-
properties.getNamespace(), chosenDataConverter, otTracer, clientCustomizer)
100+
properties.getNamespace(),
101+
chosenDataConverter,
102+
otTracer,
103+
clientCustomizer,
104+
scheduleCustomizer)
98105
.createWorkflowClientOptions());
99106

100107
if (metricsScope != null) {

temporal-spring-boot-autoconfigure-alpha/src/main/java/io/temporal/spring/boot/autoconfigure/template/ClientTemplate.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import io.opentracing.Tracer;
2525
import io.temporal.client.WorkflowClient;
2626
import io.temporal.client.WorkflowClientOptions;
27+
import io.temporal.client.schedules.ScheduleClient;
28+
import io.temporal.client.schedules.ScheduleClientOptions;
2729
import io.temporal.common.converter.DataConverter;
2830
import io.temporal.serviceclient.WorkflowServiceStubs;
2931
import io.temporal.spring.boot.TemporalOptionsCustomizer;
@@ -37,16 +39,19 @@ public class ClientTemplate {
3739
private final @Nullable TestWorkflowEnvironmentAdapter testWorkflowEnvironment;
3840

3941
private WorkflowClient workflowClient;
42+
private ScheduleClient scheduleClient;
4043

4144
public ClientTemplate(
4245
@Nonnull String namespace,
4346
@Nullable DataConverter dataConverter,
4447
@Nullable Tracer tracer,
4548
@Nullable WorkflowServiceStubs workflowServiceStubs,
4649
@Nullable TestWorkflowEnvironmentAdapter testWorkflowEnvironment,
47-
@Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> customizer) {
50+
@Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer,
51+
@Nullable TemporalOptionsCustomizer<ScheduleClientOptions.Builder> scheduleCustomer) {
4852
this.optionsTemplate =
49-
new WorkflowClientOptionsTemplate(namespace, dataConverter, tracer, customizer);
53+
new WorkflowClientOptionsTemplate(
54+
namespace, dataConverter, tracer, clientCustomizer, scheduleCustomer);
5055
this.workflowServiceStubs = workflowServiceStubs;
5156
this.testWorkflowEnvironment = testWorkflowEnvironment;
5257
}
@@ -58,6 +63,13 @@ public WorkflowClient getWorkflowClient() {
5863
return workflowClient;
5964
}
6065

66+
public ScheduleClient getScheduleClient() {
67+
if (scheduleClient == null) {
68+
this.scheduleClient = createScheduleClient();
69+
}
70+
return scheduleClient;
71+
}
72+
6173
private WorkflowClient createWorkflowClient() {
6274
if (testWorkflowEnvironment != null) {
6375
return testWorkflowEnvironment.getWorkflowClient();
@@ -68,4 +80,16 @@ private WorkflowClient createWorkflowClient() {
6880
workflowServiceStubs, optionsTemplate.createWorkflowClientOptions());
6981
}
7082
}
83+
84+
private ScheduleClient createScheduleClient() {
85+
if (testWorkflowEnvironment != null) {
86+
return ScheduleClient.newInstance(
87+
testWorkflowEnvironment.getWorkflowClient().getWorkflowServiceStubs());
88+
} else {
89+
Preconditions.checkState(
90+
workflowServiceStubs != null, "ClientTemplate was created without workflowServiceStubs");
91+
return ScheduleClient.newInstance(
92+
workflowServiceStubs, optionsTemplate.createScheduleClientOptions());
93+
}
94+
}
7195
}

temporal-spring-boot-autoconfigure-alpha/src/main/java/io/temporal/spring/boot/autoconfigure/template/NamespaceTemplate.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import io.opentracing.Tracer;
2424
import io.temporal.client.WorkflowClientOptions;
25+
import io.temporal.client.schedules.ScheduleClientOptions;
2526
import io.temporal.common.converter.DataConverter;
2627
import io.temporal.serviceclient.WorkflowServiceStubs;
2728
import io.temporal.spring.boot.TemporalOptionsCustomizer;
@@ -44,6 +45,8 @@ public class NamespaceTemplate {
4445
workerFactoryCustomizer;
4546
private final @Nullable TemporalOptionsCustomizer<WorkerOptions.Builder> workerCustomizer;
4647
private final @Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer;
48+
private final @Nullable TemporalOptionsCustomizer<ScheduleClientOptions.Builder>
49+
scheduleCustomizer;
4750

4851
private ClientTemplate clientTemplate;
4952
private WorkersTemplate workersTemplate;
@@ -57,7 +60,8 @@ public NamespaceTemplate(
5760
@Nullable TestWorkflowEnvironmentAdapter testWorkflowEnvironment,
5861
@Nullable TemporalOptionsCustomizer<WorkerFactoryOptions.Builder> workerFactoryCustomizer,
5962
@Nullable TemporalOptionsCustomizer<WorkerOptions.Builder> workerCustomizer,
60-
@Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer) {
63+
@Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer,
64+
@Nullable TemporalOptionsCustomizer<ScheduleClientOptions.Builder> scheduleCustomizer) {
6165
this.properties = properties;
6266
this.namespaceProperties = namespaceProperties;
6367
this.workflowServiceStubs = workflowServiceStubs;
@@ -68,6 +72,7 @@ public NamespaceTemplate(
6872
this.workerFactoryCustomizer = workerFactoryCustomizer;
6973
this.workerCustomizer = workerCustomizer;
7074
this.clientCustomizer = clientCustomizer;
75+
this.scheduleCustomizer = scheduleCustomizer;
7176
}
7277

7378
public ClientTemplate getClientTemplate() {
@@ -79,7 +84,8 @@ public ClientTemplate getClientTemplate() {
7984
tracer,
8085
workflowServiceStubs,
8186
testWorkflowEnvironment,
82-
clientCustomizer);
87+
clientCustomizer,
88+
scheduleCustomizer);
8389
}
8490
return clientTemplate;
8591
}

temporal-spring-boot-autoconfigure-alpha/src/main/java/io/temporal/spring/boot/autoconfigure/template/WorkflowClientOptionsTemplate.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import io.opentracing.Tracer;
2424
import io.temporal.client.WorkflowClientOptions;
25+
import io.temporal.client.schedules.ScheduleClientOptions;
2526
import io.temporal.common.converter.DataConverter;
2627
import io.temporal.opentracing.OpenTracingClientInterceptor;
2728
import io.temporal.opentracing.OpenTracingOptions;
@@ -34,17 +35,21 @@ public class WorkflowClientOptionsTemplate {
3435
private final @Nonnull String namespace;
3536
private final @Nullable DataConverter dataConverter;
3637
private final @Nullable Tracer tracer;
37-
private final @Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> customizer;
38+
private final @Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer;
39+
private final @Nullable TemporalOptionsCustomizer<ScheduleClientOptions.Builder>
40+
scheduleCustomizer;
3841

3942
public WorkflowClientOptionsTemplate(
4043
@Nonnull String namespace,
4144
@Nullable DataConverter dataConverter,
4245
@Nullable Tracer tracer,
43-
@Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> customizer) {
46+
@Nullable TemporalOptionsCustomizer<WorkflowClientOptions.Builder> clientCustomizer,
47+
@Nullable TemporalOptionsCustomizer<ScheduleClientOptions.Builder> scheduleCustomizer) {
4448
this.namespace = namespace;
4549
this.dataConverter = dataConverter;
4650
this.tracer = tracer;
47-
this.customizer = customizer;
51+
this.clientCustomizer = clientCustomizer;
52+
this.scheduleCustomizer = scheduleCustomizer;
4853
}
4954

5055
public WorkflowClientOptions createWorkflowClientOptions() {
@@ -59,8 +64,20 @@ public WorkflowClientOptions createWorkflowClientOptions() {
5964
options.setInterceptors(openTracingClientInterceptor);
6065
}
6166

62-
if (customizer != null) {
63-
options = customizer.customize(options);
67+
if (clientCustomizer != null) {
68+
options = clientCustomizer.customize(options);
69+
}
70+
71+
return options.build();
72+
}
73+
74+
public ScheduleClientOptions createScheduleClientOptions() {
75+
ScheduleClientOptions.Builder options = ScheduleClientOptions.newBuilder();
76+
options.setNamespace(namespace);
77+
Optional.ofNullable(dataConverter).ifPresent(options::setDataConverter);
78+
79+
if (scheduleCustomizer != null) {
80+
options = scheduleCustomizer.customize(options);
6481
}
6582

6683
return options.build();

temporal-spring-boot-autoconfigure-alpha/src/test/java/io/temporal/spring/boot/autoconfigure/ClientOnlyTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
package io.temporal.spring.boot.autoconfigure;
2222

2323
import static org.junit.jupiter.api.Assertions.assertEquals;
24+
import static org.junit.jupiter.api.Assertions.assertNotNull;
2425

2526
import io.grpc.health.v1.HealthCheckResponse;
2627
import io.temporal.client.WorkflowClient;
28+
import io.temporal.client.schedules.ScheduleClient;
2729
import io.temporal.testing.TestWorkflowEnvironment;
2830
import org.junit.jupiter.api.BeforeEach;
2931
import org.junit.jupiter.api.Test;
@@ -44,6 +46,8 @@ public class ClientOnlyTest {
4446

4547
@Autowired WorkflowClient workflowClient;
4648

49+
@Autowired ScheduleClient scheduleClient;
50+
4751
@BeforeEach
4852
void setUp() {
4953
applicationContext.start();
@@ -57,6 +61,12 @@ public void testClientWiring() {
5761
assertEquals(HealthCheckResponse.ServingStatus.SERVING, healthCheckResponse.getStatus());
5862
}
5963

64+
@Test
65+
public void testScheduleClientWiring() {
66+
assertNotNull(scheduleClient);
67+
assertNotNull(scheduleClient.getHandle("test"));
68+
}
69+
6070
@ComponentScan(
6171
excludeFilters =
6272
@ComponentScan.Filter(

0 commit comments

Comments
 (0)