From da12470d6df054d2bd519bd7b89715ede9eaf7c9 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Thu, 22 Sep 2022 19:42:54 -0700
Subject: [PATCH 01/12] add middleware implementation
---
.../middleware/OrchestrationMiddleware.java | 76 +++++++++++++++++++
...ctions.middleware.FunctionWorkerMiddleware | 1 +
.../java/com/functions/AzureFunctions.java | 33 +++++---
3 files changed, 99 insertions(+), 11 deletions(-)
create mode 100644 azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
create mode 100644 azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
new file mode 100644
index 0000000..6396fef
--- /dev/null
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -0,0 +1,76 @@
+package com.microsoft.durabletask.azurefunctions.internal.middleware;
+
+import com.microsoft.azure.functions.internal.MiddlewareContext;
+import com.microsoft.azure.functions.middleware.FunctionWorkerChain;
+import com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware;
+import com.microsoft.durabletask.OrchestrationRunner;
+import com.microsoft.durabletask.OrchestratorBlockedEvent;
+import com.microsoft.durabletask.TaskFailedException;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Parameter;
+import java.util.Map;
+
+/**
+ * Durable Function Orchestration Middleware
+ *
+ *
This class is internal and is hence not for public use. Its APIs are unstable and can change
+ * at any time.
+ */
+public class OrchestrationMiddleware implements FunctionWorkerMiddleware {
+
+ private static final String ORCHESTRATION_TRIGGER = "DurableOrchestrationTrigger";
+
+ @Override
+ public void invoke(MiddlewareContext context, FunctionWorkerChain next) throws Exception {
+ Pair pair = isOrchestrationTrigger(context);
+ if (!pair.isOrchestrationTrigger){
+ next.doNext(context);
+ return;
+ }
+ String orchestratorRequestProtoBytes = (String) context.getParameterPayloadByName(pair.parameterName);
+ String orchestratorOutput = OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
+ try {
+ context.updateParameterPayloadByName(pair.parameterName, ctx);
+ next.doNext(context);
+ return context.getReturnValue();
+ } catch (Exception e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof OrchestratorBlockedEvent){
+ throw (OrchestratorBlockedEvent) cause;
+ }
+ throw new RuntimeException("Unexpected failure in the task execution", e);
+ }
+ });
+ context.setMiddlewareOutput(orchestratorOutput);
+ }
+
+ private static Pair isOrchestrationTrigger(MiddlewareContext context) {
+ for (Map.Entry entry : context.getParameterMap().entrySet()){
+ if (isOrchestrationTrigger(entry.getValue())){
+ return new Pair(true, entry.getKey());
+ }
+ }
+ return new Pair(false, null);
+ }
+
+ private static boolean isOrchestrationTrigger(Parameter parameter){
+ Annotation[] annotations = parameter.getAnnotations();
+ for (Annotation annotation : annotations) {
+ if(annotation.annotationType().getSimpleName().equals(ORCHESTRATION_TRIGGER)){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static class Pair{
+ private final boolean isOrchestrationTrigger;
+ private final String parameterName;
+
+ private Pair(boolean isOrchestrationTrigger, String parameterName) {
+ this.isOrchestrationTrigger = isOrchestrationTrigger;
+ this.parameterName = parameterName;
+ }
+ }
+}
diff --git a/azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware b/azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware
new file mode 100644
index 0000000..2616849
--- /dev/null
+++ b/azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware
@@ -0,0 +1 @@
+com.microsoft.durabletask.azurefunctions.internal.middleware.OrchestrationMiddleware
\ No newline at end of file
diff --git a/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java b/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java
index aa8a707..2d9fb14 100644
--- a/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java
+++ b/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java
@@ -4,8 +4,7 @@
import com.microsoft.azure.functions.*;
import java.util.*;
-import com.microsoft.durabletask.DurableTaskClient;
-import com.microsoft.durabletask.OrchestrationRunner;
+import com.microsoft.durabletask.*;
import com.microsoft.durabletask.azurefunctions.DurableActivityTrigger;
import com.microsoft.durabletask.azurefunctions.DurableClientContext;
import com.microsoft.durabletask.azurefunctions.DurableClientInput;
@@ -35,17 +34,29 @@ public HttpResponseMessage startOrchestration(
* This is the orchestrator function. The OrchestrationRunner.loadAndRun() static
* method is used to take the function input and execute the orchestrator logic.
*/
+// @FunctionName("Cities")
+// public String citiesOrchestrator(
+// @DurableOrchestrationTrigger(name = "orchestratorRequestProtoBytes") String orchestratorRequestProtoBytes) {
+// return OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
+// String result = "";
+// result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
+// result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
+// result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
+// result += ctx.callActivity("Capitalize", "Austin", String.class).await();
+// return result;
+// });
+// }
+
@FunctionName("Cities")
public String citiesOrchestrator(
- @DurableOrchestrationTrigger(name = "orchestratorRequestProtoBytes") String orchestratorRequestProtoBytes) {
- return OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
- String result = "";
- result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
- result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
- result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
- result += ctx.callActivity("Capitalize", "Austin", String.class).await();
- return result;
- });
+ @DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx)
+ throws TaskFailedException, OrchestratorBlockedEvent {
+ String result = "";
+ result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
+ result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
+ result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
+ result += ctx.callActivity("Capitalize", "Austin", String.class).await();
+ return result;
}
/**
From 9019a21e6603563a38f7f20d05fb504bcf3eec28 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Fri, 23 Sep 2022 13:16:09 -0700
Subject: [PATCH 02/12] update code with new API
---
.../middleware/OrchestrationMiddleware.java | 38 +++----------------
1 file changed, 5 insertions(+), 33 deletions(-)
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
index 6396fef..0924417 100644
--- a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -10,6 +10,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Parameter;
import java.util.Map;
+import java.util.Optional;
/**
* Durable Function Orchestration Middleware
@@ -23,15 +24,15 @@ public class OrchestrationMiddleware implements FunctionWorkerMiddleware {
@Override
public void invoke(MiddlewareContext context, FunctionWorkerChain next) throws Exception {
- Pair pair = isOrchestrationTrigger(context);
- if (!pair.isOrchestrationTrigger){
+ Optional parameterName = context.getParameterName(ORCHESTRATION_TRIGGER);
+ if (!parameterName.isPresent()){
next.doNext(context);
return;
}
- String orchestratorRequestProtoBytes = (String) context.getParameterPayloadByName(pair.parameterName);
+ String orchestratorRequestProtoBytes = (String) context.getParameterPayloadByName(parameterName.get());
String orchestratorOutput = OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
try {
- context.updateParameterPayloadByName(pair.parameterName, ctx);
+ context.updateParameterPayloadByName(parameterName.get(), ctx);
next.doNext(context);
return context.getReturnValue();
} catch (Exception e) {
@@ -44,33 +45,4 @@ public void invoke(MiddlewareContext context, FunctionWorkerChain next) throws E
});
context.setMiddlewareOutput(orchestratorOutput);
}
-
- private static Pair isOrchestrationTrigger(MiddlewareContext context) {
- for (Map.Entry entry : context.getParameterMap().entrySet()){
- if (isOrchestrationTrigger(entry.getValue())){
- return new Pair(true, entry.getKey());
- }
- }
- return new Pair(false, null);
- }
-
- private static boolean isOrchestrationTrigger(Parameter parameter){
- Annotation[] annotations = parameter.getAnnotations();
- for (Annotation annotation : annotations) {
- if(annotation.annotationType().getSimpleName().equals(ORCHESTRATION_TRIGGER)){
- return true;
- }
- }
- return false;
- }
-
- private static class Pair{
- private final boolean isOrchestrationTrigger;
- private final String parameterName;
-
- private Pair(boolean isOrchestrationTrigger, String parameterName) {
- this.isOrchestrationTrigger = isOrchestrationTrigger;
- this.parameterName = parameterName;
- }
- }
}
From 614ddf7d50e521e703168f4f593bade1419a2e72 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Sun, 25 Sep 2022 10:02:53 -0700
Subject: [PATCH 03/12] rename middleware chain
---
.../internal/middleware/OrchestrationMiddleware.java | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
index 0924417..96ff479 100644
--- a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -1,15 +1,10 @@
package com.microsoft.durabletask.azurefunctions.internal.middleware;
import com.microsoft.azure.functions.internal.MiddlewareContext;
-import com.microsoft.azure.functions.middleware.FunctionWorkerChain;
+import com.microsoft.azure.functions.middleware.FunctionMiddlewareChain;
import com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware;
import com.microsoft.durabletask.OrchestrationRunner;
import com.microsoft.durabletask.OrchestratorBlockedEvent;
-import com.microsoft.durabletask.TaskFailedException;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Parameter;
-import java.util.Map;
import java.util.Optional;
/**
@@ -23,7 +18,7 @@ public class OrchestrationMiddleware implements FunctionWorkerMiddleware {
private static final String ORCHESTRATION_TRIGGER = "DurableOrchestrationTrigger";
@Override
- public void invoke(MiddlewareContext context, FunctionWorkerChain next) throws Exception {
+ public void invoke(MiddlewareContext context, FunctionMiddlewareChain next) throws Exception {
Optional parameterName = context.getParameterName(ORCHESTRATION_TRIGGER);
if (!parameterName.isPresent()){
next.doNext(context);
From 4c8c55bdc1164b6d192c55e9f22590a7a579b284 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Mon, 26 Sep 2022 20:47:47 -0700
Subject: [PATCH 04/12] minor updates
---
.../internal/middleware/OrchestrationMiddleware.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
index 96ff479..477d963 100644
--- a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -24,10 +24,10 @@ public void invoke(MiddlewareContext context, FunctionMiddlewareChain next) thro
next.doNext(context);
return;
}
- String orchestratorRequestProtoBytes = (String) context.getParameterPayloadByName(parameterName.get());
+ String orchestratorRequestProtoBytes = (String) context.getParameterValue(parameterName.get());
String orchestratorOutput = OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
try {
- context.updateParameterPayloadByName(parameterName.get(), ctx);
+ context.updateParameterValue(parameterName.get(), ctx);
next.doNext(context);
return context.getReturnValue();
} catch (Exception e) {
@@ -38,6 +38,6 @@ public void invoke(MiddlewareContext context, FunctionMiddlewareChain next) thro
throw new RuntimeException("Unexpected failure in the task execution", e);
}
});
- context.setMiddlewareOutput(orchestratorOutput);
+ context.setReturnValue(orchestratorOutput);
}
}
From 9af9df3b7e6ae4ab0408d0ed92746e6c7df99f68 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Tue, 27 Sep 2022 12:59:52 -0700
Subject: [PATCH 05/12] refactor code
---
.../middleware/OrchestrationMiddleware.java | 27 ++++++++++++-------
...ctions.internal.spi.middleware.Middleware} | 0
.../java/com/functions/AzureFunctions.java | 13 ---------
3 files changed, 17 insertions(+), 23 deletions(-)
rename azurefunctions/src/main/resources/META-INF/services/{com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware => com.microsoft.azure.functions.internal.spi.middleware.Middleware} (100%)
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
index 477d963..ac3519f 100644
--- a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -1,11 +1,16 @@
+/**
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for
+ * license information.
+ */
+
package com.microsoft.durabletask.azurefunctions.internal.middleware;
-import com.microsoft.azure.functions.internal.MiddlewareContext;
-import com.microsoft.azure.functions.middleware.FunctionMiddlewareChain;
-import com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware;
+import com.microsoft.azure.functions.internal.spi.middleware.Middleware;
+import com.microsoft.azure.functions.internal.spi.middleware.MiddlewareChain;
+import com.microsoft.azure.functions.internal.spi.middleware.MiddlewareContext;
import com.microsoft.durabletask.OrchestrationRunner;
import com.microsoft.durabletask.OrchestratorBlockedEvent;
-import java.util.Optional;
/**
* Durable Function Orchestration Middleware
@@ -13,24 +18,26 @@
* This class is internal and is hence not for public use. Its APIs are unstable and can change
* at any time.
*/
-public class OrchestrationMiddleware implements FunctionWorkerMiddleware {
+public class OrchestrationMiddleware implements Middleware {
private static final String ORCHESTRATION_TRIGGER = "DurableOrchestrationTrigger";
@Override
- public void invoke(MiddlewareContext context, FunctionMiddlewareChain next) throws Exception {
- Optional parameterName = context.getParameterName(ORCHESTRATION_TRIGGER);
- if (!parameterName.isPresent()){
+ public void invoke(MiddlewareContext context, MiddlewareChain next) throws Exception {
+ String parameterName = context.getParameterName(ORCHESTRATION_TRIGGER);
+ if (parameterName == null){
next.doNext(context);
return;
}
- String orchestratorRequestProtoBytes = (String) context.getParameterValue(parameterName.get());
+ String orchestratorRequestProtoBytes = (String) context.getParameterValue(parameterName);
String orchestratorOutput = OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
try {
- context.updateParameterValue(parameterName.get(), ctx);
+ context.updateParameterValue(parameterName, ctx);
next.doNext(context);
return context.getReturnValue();
} catch (Exception e) {
+ // The OrchestratorBlockedEvent will be wrapped into InvocationTargetException by using reflection to
+ // invoke method. Thus get the cause to check if it's OrchestratorBlockedEvent.
Throwable cause = e.getCause();
if (cause instanceof OrchestratorBlockedEvent){
throw (OrchestratorBlockedEvent) cause;
diff --git a/azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware b/azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.internal.spi.middleware.Middleware
similarity index 100%
rename from azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware
rename to azurefunctions/src/main/resources/META-INF/services/com.microsoft.azure.functions.internal.spi.middleware.Middleware
diff --git a/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java b/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java
index 2d9fb14..8c9c355 100644
--- a/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java
+++ b/samples-azure-functions/src/main/java/com/functions/AzureFunctions.java
@@ -34,19 +34,6 @@ public HttpResponseMessage startOrchestration(
* This is the orchestrator function. The OrchestrationRunner.loadAndRun() static
* method is used to take the function input and execute the orchestrator logic.
*/
-// @FunctionName("Cities")
-// public String citiesOrchestrator(
-// @DurableOrchestrationTrigger(name = "orchestratorRequestProtoBytes") String orchestratorRequestProtoBytes) {
-// return OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
-// String result = "";
-// result += ctx.callActivity("Capitalize", "Tokyo", String.class).await() + ", ";
-// result += ctx.callActivity("Capitalize", "London", String.class).await() + ", ";
-// result += ctx.callActivity("Capitalize", "Seattle", String.class).await() + ", ";
-// result += ctx.callActivity("Capitalize", "Austin", String.class).await();
-// return result;
-// });
-// }
-
@FunctionName("Cities")
public String citiesOrchestrator(
@DurableOrchestrationTrigger(name = "taskOrchestrationContext") TaskOrchestrationContext ctx)
From c4a238162cf88ab8279e358d6c6b26ee29dcd529 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Tue, 27 Sep 2022 15:12:05 -0700
Subject: [PATCH 06/12] update method/variable names make them more clear
---
.../internal/middleware/OrchestrationMiddleware.java | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
index ac3519f..e5f0a36 100644
--- a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -23,17 +23,17 @@ public class OrchestrationMiddleware implements Middleware {
private static final String ORCHESTRATION_TRIGGER = "DurableOrchestrationTrigger";
@Override
- public void invoke(MiddlewareContext context, MiddlewareChain next) throws Exception {
+ public void invoke(MiddlewareContext context, MiddlewareChain chain) throws Exception {
String parameterName = context.getParameterName(ORCHESTRATION_TRIGGER);
if (parameterName == null){
- next.doNext(context);
+ chain.doNext(context);
return;
}
- String orchestratorRequestProtoBytes = (String) context.getParameterValue(parameterName);
- String orchestratorOutput = OrchestrationRunner.loadAndRun(orchestratorRequestProtoBytes, ctx -> {
+ String orchestratorRequestEncodedProtoBytes = (String) context.getParameterValue(parameterName);
+ String orchestratorOutputEncodedProtoBytes = OrchestrationRunner.loadAndRun(orchestratorRequestEncodedProtoBytes, ctx -> {
try {
context.updateParameterValue(parameterName, ctx);
- next.doNext(context);
+ chain.doNext(context);
return context.getReturnValue();
} catch (Exception e) {
// The OrchestratorBlockedEvent will be wrapped into InvocationTargetException by using reflection to
@@ -45,6 +45,6 @@ public void invoke(MiddlewareContext context, MiddlewareChain next) throws Excep
throw new RuntimeException("Unexpected failure in the task execution", e);
}
});
- context.setReturnValue(orchestratorOutput);
+ context.updateReturnValue(orchestratorOutputEncodedProtoBytes);
}
}
From e53331cbf47a902d53aa5de3d82ecfedff8fac44 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Tue, 27 Sep 2022 15:15:08 -0700
Subject: [PATCH 07/12] update ctx to taskOrchestrationContext make it more
clear
---
.../internal/middleware/OrchestrationMiddleware.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
index e5f0a36..e4b662c 100644
--- a/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
+++ b/azurefunctions/src/main/java/com/microsoft/durabletask/azurefunctions/internal/middleware/OrchestrationMiddleware.java
@@ -30,9 +30,9 @@ public void invoke(MiddlewareContext context, MiddlewareChain chain) throws Exce
return;
}
String orchestratorRequestEncodedProtoBytes = (String) context.getParameterValue(parameterName);
- String orchestratorOutputEncodedProtoBytes = OrchestrationRunner.loadAndRun(orchestratorRequestEncodedProtoBytes, ctx -> {
+ String orchestratorOutputEncodedProtoBytes = OrchestrationRunner.loadAndRun(orchestratorRequestEncodedProtoBytes, taskOrchestrationContext -> {
try {
- context.updateParameterValue(parameterName, ctx);
+ context.updateParameterValue(parameterName, taskOrchestrationContext);
chain.doNext(context);
return context.getReturnValue();
} catch (Exception e) {
From 4112ddbdfd245a6cb4e15bf217fcfef62a4fabb2 Mon Sep 17 00:00:00 2001
From: Shreyas Gopalakrishna
<11889130+shreyas-gopalakrishna@users.noreply.github.com>
Date: Thu, 6 Oct 2022 21:10:45 -0500
Subject: [PATCH 08/12] Update build-validation.yml
---
.github/workflows/build-validation.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/build-validation.yml b/.github/workflows/build-validation.yml
index f883fec..3afb386 100644
--- a/.github/workflows/build-validation.yml
+++ b/.github/workflows/build-validation.yml
@@ -83,7 +83,7 @@ jobs:
continue-on-error: true
- name: Download azure functions java library # TODO: Remove this step once gradle plugin is updated
run: |
- wget -P samples-azure-functions/build/azure-functions/azure-functions-sample/lib/ "https://repo.maven.apache.org/maven2/com/microsoft/azure/functions/azure-functions-java-library/2.0.1/azure-functions-java-library-2.0.1.jar" --show-progress
+ wget -P samples-azure-functions/build/azure-functions/azure-functions-sample/lib/ "https://repo.maven.apache.org/maven2/com/microsoft/azure/functions/azure-functions-java-library/2.1.0/azure-functions-java-library-2.1.0.jar" --show-progress
- name: Run azure functions test
run: samples-azure-functions/e2e-test.ps1 -DockerfilePath samples-azure-functions/Dockerfile -HttpStartPath api/StartOrchestration
- shell: pwsh
\ No newline at end of file
+ shell: pwsh
From a2c30b0ee53057bfab7a1a8875da31fd50cfbdad Mon Sep 17 00:00:00 2001
From: Shreyas Gopalakrishna
<11889130+shreyas-gopalakrishna@users.noreply.github.com>
Date: Thu, 6 Oct 2022 21:11:55 -0500
Subject: [PATCH 09/12] Update build.gradle
---
azurefunctions/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/azurefunctions/build.gradle b/azurefunctions/build.gradle
index 4ec2268..eead4a6 100644
--- a/azurefunctions/build.gradle
+++ b/azurefunctions/build.gradle
@@ -17,7 +17,7 @@ repositories {
dependencies {
api project(':client')
- implementation group: 'com.microsoft.azure.functions', name: 'azure-functions-java-library', version: '2.0.1'
+ implementation group: 'com.microsoft.azure.functions', name: 'azure-functions-java-library', version: '2.1.0'
implementation "com.google.protobuf:protobuf-java:${protocVersion}"
}
@@ -59,4 +59,4 @@ publishing {
java {
withSourcesJar()
withJavadocJar()
-}
\ No newline at end of file
+}
From 2ebcd27274db328b7a6fd97c7a33e524f44d98a5 Mon Sep 17 00:00:00 2001
From: Shreyas Gopalakrishna
<11889130+shreyas-gopalakrishna@users.noreply.github.com>
Date: Thu, 6 Oct 2022 21:12:43 -0500
Subject: [PATCH 10/12] Update build.gradle
---
samples-azure-functions/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samples-azure-functions/build.gradle b/samples-azure-functions/build.gradle
index 7bf8589..c16d91b 100644
--- a/samples-azure-functions/build.gradle
+++ b/samples-azure-functions/build.gradle
@@ -19,7 +19,7 @@ dependencies {
implementation project(':client')
implementation project(':azurefunctions')
- implementation 'com.microsoft.azure.functions:azure-functions-java-library:2.0.1'
+ implementation 'com.microsoft.azure.functions:azure-functions-java-library:2.1.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2'
testImplementation 'org.mockito:mockito-core:3.3.3'
runtimeOnly "io.grpc:grpc-netty-shaded:1.38.0"
From 736067ffa2da41d9daedbcd90a5d3ecbe5d2dd74 Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Mon, 24 Oct 2022 16:44:17 -0500
Subject: [PATCH 11/12] update to latest worker 2.7.0
---
samples-azure-functions/Dockerfile | 2 +-
... => azure-functions-java-worker-2.7.0.jar} | Bin 21839381 -> 19010528 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
rename samples-azure-functions/{azure-functions-java-worker-2.2.3.jar => azure-functions-java-worker-2.7.0.jar} (84%)
diff --git a/samples-azure-functions/Dockerfile b/samples-azure-functions/Dockerfile
index d6e2861..ea888da 100644
--- a/samples-azure-functions/Dockerfile
+++ b/samples-azure-functions/Dockerfile
@@ -1,7 +1,7 @@
FROM mcr.microsoft.com/azure-functions/java:4-java11
RUN rm /azure-functions-host/workers/java/azure-functions-java-worker.jar
-COPY samples-azure-functions/azure-functions-java-worker-2.2.3.jar /azure-functions-host/workers/java/azure-functions-java-worker.jar
+COPY samples-azure-functions/azure-functions-java-worker-2.7.0.jar /azure-functions-host/workers/java/azure-functions-java-worker.jar
COPY samples-azure-functions/build/azure-functions/azure-functions-sample/ /home/site/wwwroot/
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true
diff --git a/samples-azure-functions/azure-functions-java-worker-2.2.3.jar b/samples-azure-functions/azure-functions-java-worker-2.7.0.jar
similarity index 84%
rename from samples-azure-functions/azure-functions-java-worker-2.2.3.jar
rename to samples-azure-functions/azure-functions-java-worker-2.7.0.jar
index 3cda882654e424d0058652fa64bc4152e355b2b8..28953a6b18e78bfb47aa20e63bec274ff3adb5ba 100644
GIT binary patch
delta 470791
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