Skip to content

Commit 8a54ce4

Browse files
committed
initial dts support changes
1 parent 8660f1b commit 8a54ce4

File tree

10 files changed

+501
-124
lines changed

10 files changed

+501
-124
lines changed

client/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ dependencies {
3434
implementation "com.fasterxml.jackson.core:jackson-annotations:${jacksonVersion}"
3535
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jacksonVersion}"
3636

37+
implementation 'com.azure:azure-identity:1.15.0'
38+
3739
testImplementation(platform('org.junit:junit-bom:5.7.2'))
3840
testImplementation('org.junit.jupiter:junit-jupiter')
3941
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.microsoft.durabletask;
2+
3+
import com.azure.core.credential.TokenCredential;
4+
import com.azure.core.credential.AccessToken;
5+
import com.azure.core.credential.TokenRequestContext;
6+
7+
import java.time.Duration;
8+
import java.time.OffsetDateTime;
9+
10+
public final class AccessTokenCache {
11+
private final TokenCredential credential;
12+
private final TokenRequestContext context;
13+
private final Duration margin;
14+
private AccessToken cachedToken;
15+
16+
public AccessTokenCache(TokenCredential credential, TokenRequestContext context, Duration margin) {
17+
this.credential = credential;
18+
this.context = context;
19+
this.margin = margin;
20+
}
21+
22+
public AccessToken getToken() {
23+
OffsetDateTime nowWithMargin = OffsetDateTime.now().plus(margin);
24+
25+
if (cachedToken == null
26+
|| cachedToken.getExpiresAt().isBefore(nowWithMargin)) {
27+
this.cachedToken = credential.getToken(context).block();
28+
}
29+
30+
return cachedToken;
31+
}
32+
}

client/src/main/java/com/microsoft/durabletask/DurableTaskGrpcWorker.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public void startAndBlock() {
140140
.setInstanceId(orchestratorRequest.getInstanceId())
141141
.addAllActions(taskOrchestratorResult.getActions())
142142
.setCustomStatus(StringValue.of(taskOrchestratorResult.getCustomStatus()))
143+
.setCompletionToken(workItem.getCompletionToken())
143144
.build();
144145

145146
this.sidecarClient.completeOrchestratorTask(response);
@@ -164,7 +165,8 @@ public void startAndBlock() {
164165

165166
ActivityResponse.Builder responseBuilder = ActivityResponse.newBuilder()
166167
.setInstanceId(activityRequest.getOrchestrationInstance().getInstanceId())
167-
.setTaskId(activityRequest.getTaskId());
168+
.setTaskId(activityRequest.getTaskId())
169+
.setCompletionToken(workItem.getCompletionToken());
168170

169171
if (output != null) {
170172
responseBuilder.setResult(StringValue.of(output));

client/src/main/java/com/microsoft/durabletask/OrchestrationRunner.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public TaskOrchestration create() {
140140
.setInstanceId(orchestratorRequest.getInstanceId())
141141
.addAllActions(taskOrchestratorResult.getActions())
142142
.setCustomStatus(StringValue.of(taskOrchestratorResult.getCustomStatus()))
143+
.setCompletionToken(null)
143144
.build();
144145
return response.toByteArray();
145146
}

samples/build.gradle

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,27 @@ plugins {
66

77
group 'io.durabletask'
88
version = '0.1.0'
9+
def grpcVersion = '1.59.0'
910
archivesBaseName = 'durabletask-samples'
1011

12+
application {
13+
mainClass = 'io.durabletask.samples.SpringDurableTaskSample'
14+
}
15+
1116
dependencies {
1217
implementation project(':client')
1318

1419
implementation 'org.springframework.boot:spring-boot-starter-web'
1520
implementation platform("org.springframework.boot:spring-boot-dependencies:2.5.2")
1621
implementation 'org.springframework.boot:spring-boot-starter'
22+
23+
// https://github.com/grpc/grpc-java#download
24+
implementation "io.grpc:grpc-protobuf:${grpcVersion}"
25+
implementation "io.grpc:grpc-stub:${grpcVersion}"
26+
runtimeOnly "io.grpc:grpc-netty-shaded:${grpcVersion}"
27+
implementation 'com.azure:azure-identity:1.15.0'
28+
29+
// install lombok
30+
annotationProcessor 'org.projectlombok:lombok:1.18.22'
31+
compileOnly 'org.projectlombok:lombok:1.18.22'
1732
}
Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,44 @@
1-
// Copyright (c) Microsoft Corporation. All rights reserved.
2-
// Licensed under the MIT License.
3-
package io.durabletask.samples;
4-
5-
import com.microsoft.durabletask.*;
6-
7-
import org.springframework.web.bind.annotation.GetMapping;
8-
import org.springframework.web.bind.annotation.RequestParam;
9-
import org.springframework.web.bind.annotation.RestController;
10-
11-
@RestController
12-
public class OrchestrationController {
13-
14-
final DurableTaskClient client;
15-
16-
public OrchestrationController() {
17-
this.client = new DurableTaskGrpcClientBuilder().build();
18-
}
19-
20-
@GetMapping("/hello")
21-
public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
22-
return String.format("Hello, %s!", name);
23-
}
24-
25-
@GetMapping("/placeOrder")
26-
public NewOrderResponse placeOrder(@RequestParam(value = "item") String item) {
27-
String instanceId = this.client.scheduleNewOrchestrationInstance(
28-
"ProcessOrderOrchestration",
29-
new NewOrchestrationInstanceOptions().setInput(item));
30-
return new NewOrderResponse(instanceId);
31-
}
32-
33-
private class NewOrderResponse {
34-
private final String instanceId;
35-
36-
public NewOrderResponse(String instanceId) {
37-
this.instanceId = instanceId;
38-
}
39-
40-
public String getInstanceId() {
41-
return this.instanceId;
42-
}
43-
}
44-
}
1+
// // Copyright (c) Microsoft Corporation. All rights reserved.
2+
// // Licensed under the MIT License.
3+
// package io.durabletask.samples;
4+
5+
// import com.microsoft.durabletask.*;
6+
7+
// import org.springframework.web.bind.annotation.GetMapping;
8+
// import org.springframework.web.bind.annotation.RequestParam;
9+
// import org.springframework.web.bind.annotation.RestController;
10+
11+
// @RestController
12+
// public class OrchestrationController {
13+
14+
// final DurableTaskClient client;
15+
16+
// public OrchestrationController() {
17+
// this.client = new DurableTaskGrpcClientBuilder().build();
18+
// }
19+
20+
// @GetMapping("/hello")
21+
// public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
22+
// return String.format("Hello, %s!", name);
23+
// }
24+
25+
// @GetMapping("/placeOrder")
26+
// public NewOrderResponse placeOrder(@RequestParam(value = "item") String item) {
27+
// String instanceId = this.client.scheduleNewOrchestrationInstance(
28+
// "ProcessOrderOrchestration",
29+
// new NewOrchestrationInstanceOptions().setInput(item));
30+
// return new NewOrderResponse(instanceId);
31+
// }
32+
33+
// private class NewOrderResponse {
34+
// private final String instanceId;
35+
36+
// public NewOrderResponse(String instanceId) {
37+
// this.instanceId = instanceId;
38+
// }
39+
40+
// public String getInstanceId() {
41+
// return this.instanceId;
42+
// }
43+
// }
44+
// }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.durabletask.samples;
2+
3+
import org.springframework.http.ResponseEntity;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
@RestController
9+
@RequestMapping("/ready")
10+
public class ReadinessController {
11+
@GetMapping
12+
public ResponseEntity<String> readiness() {
13+
return ResponseEntity.ok("Application is ready");
14+
}
15+
}

0 commit comments

Comments
 (0)