From 3ec2cdba79ece4e5041ea6e20456572f3cbb2af0 Mon Sep 17 00:00:00 2001 From: Bill Burke Date: Thu, 8 Sep 2022 10:31:01 -0400 Subject: [PATCH] Dependency injection hooks --- .../binding/ExecutionContextDataSource.java | 30 +++++++++++++++++-- .../broker/FunctionMethodExecutorImpl.java | 18 ++++++++++- .../worker/broker/JavaFunctionBroker.java | 3 +- .../worker/broker/JavaMethodExecutor.java | 4 +++ .../chain/FunctionExecutionMiddleware.java | 3 +- .../worker/chain/InvocationChain.java | 4 +-- 6 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionContextDataSource.java b/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionContextDataSource.java index 8206171e..4c9ae979 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionContextDataSource.java +++ b/src/main/java/com/microsoft/azure/functions/worker/binding/ExecutionContextDataSource.java @@ -3,11 +3,14 @@ import java.util.logging.Logger; import com.microsoft.azure.functions.ExecutionContext; +import com.microsoft.azure.functions.middleware.MiddlewareExecutionContext; import com.microsoft.azure.functions.worker.WorkerLogManager; import com.microsoft.azure.functions.TraceContext; import com.microsoft.azure.functions.RetryContext; +import com.microsoft.azure.functions.worker.broker.FunctionMethodExecutorImpl; +import com.microsoft.azure.functions.worker.broker.JavaMethodExecutor; -public final class ExecutionContextDataSource extends DataSource implements ExecutionContext { +public final class ExecutionContextDataSource extends DataSource implements MiddlewareExecutionContext { private final String invocationId; private final TraceContext traceContext; @@ -15,14 +18,17 @@ public final class ExecutionContextDataSource extends DataSource EXECONTEXT_DATA_OPERATIONS = new DataOperations<>(); static { EXECONTEXT_DATA_OPERATIONS.addGenericOperation(ExecutionContext.class, DataOperations::generalAssignment); diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionMethodExecutorImpl.java b/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionMethodExecutorImpl.java index de43aab3..35b9f7a2 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionMethodExecutorImpl.java +++ b/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionMethodExecutorImpl.java @@ -53,13 +53,29 @@ public void execute(ExecutionContextDataSource executionContextDataSource) throw BindingDataStore dataStore = executionContextDataSource.getDataStore(); Object retValue = this.overloadResolver.resolve(dataStore) .orElseThrow(() -> new NoSuchMethodException("Cannot locate the method signature with the given input")) - .invoke(() -> this.containingClass.newInstance()); + .invoke(() -> { + Object target = executionContextDataSource.getFunctionInstance(); + if (target == null) { + target = this.containingClass.newInstance(); + } + return target; + }); dataStore.setDataTargetValue(BindingDataStore.RETURN_NAME, retValue); } finally { Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); } } + @Override + public Class getContainingClass() { + return containingClass; + } + + @Override + public ClassLoader getClassLoader() { + return classLoader; + } + private Class getContainingClass(String className) throws ClassNotFoundException { return Class.forName(className, false, this.classLoader); } diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java index b1051974..c82bf6c1 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java +++ b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java @@ -10,6 +10,7 @@ import com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware; import com.microsoft.azure.functions.rpc.messages.*; import com.microsoft.azure.functions.worker.Constants; +import com.microsoft.azure.functions.worker.WorkerLogManager; import com.microsoft.azure.functions.worker.binding.BindingDataStore; import com.microsoft.azure.functions.worker.binding.ExecutionContextDataSource; import com.microsoft.azure.functions.worker.binding.ExecutionRetryContext; @@ -80,7 +81,7 @@ public Optional invokeMethod(String id, InvocationRequest request, Li dataStore.addParameterSources(request.getInputDataList()); ExecutionTraceContext traceContext = new ExecutionTraceContext(request.getTraceContext().getTraceParent(), request.getTraceContext().getTraceState(), request.getTraceContext().getAttributesMap()); ExecutionRetryContext retryContext = new ExecutionRetryContext(request.getRetryContext().getRetryCount(), request.getRetryContext().getMaxRetryCount(), request.getRetryContext().getException()); - ExecutionContextDataSource executionContextDataSource = new ExecutionContextDataSource(request.getInvocationId(), methodEntry.left, traceContext, retryContext); + ExecutionContextDataSource executionContextDataSource = new ExecutionContextDataSource(executor, request.getInvocationId(), methodEntry.left, traceContext, retryContext); dataStore.addExecutionContextSource(executionContextDataSource); executionContextDataSource.setDataStore(dataStore); this.invocationChainBuilder.build(executor).doNext(executionContextDataSource); diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java index fcb4e3aa..3ee79aae 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java +++ b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java @@ -15,4 +15,8 @@ public interface JavaMethodExecutor { ParameterResolver getOverloadResolver(); void execute(ExecutionContextDataSource executionContextDataSource) throws Exception; + + Class getContainingClass(); + + ClassLoader getClassLoader(); } diff --git a/src/main/java/com/microsoft/azure/functions/worker/chain/FunctionExecutionMiddleware.java b/src/main/java/com/microsoft/azure/functions/worker/chain/FunctionExecutionMiddleware.java index 1175bea5..f6265b2d 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/chain/FunctionExecutionMiddleware.java +++ b/src/main/java/com/microsoft/azure/functions/worker/chain/FunctionExecutionMiddleware.java @@ -3,6 +3,7 @@ import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.middleware.FunctionWorkerChain; import com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware; +import com.microsoft.azure.functions.middleware.MiddlewareExecutionContext; import com.microsoft.azure.functions.worker.binding.ExecutionContextDataSource; import com.microsoft.azure.functions.worker.broker.JavaMethodExecutor; import org.apache.commons.lang3.exception.ExceptionUtils; @@ -16,7 +17,7 @@ public FunctionExecutionMiddleware(JavaMethodExecutor functionExecutor) { } @Override - public void invoke(ExecutionContext context, FunctionWorkerChain next) throws Exception{ + public void invoke(MiddlewareExecutionContext context, FunctionWorkerChain next) throws Exception{ this.functionExecutor.execute((ExecutionContextDataSource) context); } } diff --git a/src/main/java/com/microsoft/azure/functions/worker/chain/InvocationChain.java b/src/main/java/com/microsoft/azure/functions/worker/chain/InvocationChain.java index b3a1213a..bc553b05 100644 --- a/src/main/java/com/microsoft/azure/functions/worker/chain/InvocationChain.java +++ b/src/main/java/com/microsoft/azure/functions/worker/chain/InvocationChain.java @@ -1,8 +1,8 @@ package com.microsoft.azure.functions.worker.chain; -import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.middleware.FunctionWorkerChain; import com.microsoft.azure.functions.middleware.FunctionWorkerMiddleware; +import com.microsoft.azure.functions.middleware.MiddlewareExecutionContext; import com.microsoft.azure.functions.worker.broker.JavaMethodExecutor; import java.util.ArrayList; @@ -18,7 +18,7 @@ public InvocationChain(List middlewareList) { } @Override - public void doNext(ExecutionContext context) throws Exception{ + public void doNext(MiddlewareExecutionContext context) throws Exception{ while (middlewareIterator.hasNext()) { middlewareIterator.next().invoke(context, this); }