Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,32 @@
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<ExecutionContext> implements ExecutionContext {
public final class ExecutionContextDataSource extends DataSource<ExecutionContext> implements MiddlewareExecutionContext {

private final String invocationId;
private final TraceContext traceContext;
private final RetryContext retryContext;
private final Logger logger;
private final String funcname;
private BindingDataStore dataStore;
private final JavaMethodExecutor executor;
private Object functionInstance;

public ExecutionContextDataSource(String invocationId, String funcname, TraceContext traceContext, RetryContext retryContext) {
public ExecutionContextDataSource(JavaMethodExecutor executor, String invocationId, String funcname, TraceContext traceContext, RetryContext retryContext) {
super(null, null, EXECONTEXT_DATA_OPERATIONS);
this.invocationId = invocationId;
this.traceContext = traceContext;
this.retryContext = retryContext;
this.logger = WorkerLogManager.getInvocationLogger(invocationId);
this.funcname = funcname;
this.executor = executor;
this.setValue(this);
}

Expand All @@ -49,6 +55,26 @@ public void setDataStore(BindingDataStore dataStore) {
this.dataStore = dataStore;
}

@Override
public ClassLoader getFunctionClassLoader() {
return executor.getClassLoader();
}

@Override
public Class getFunctionClass() {
return executor.getContainingClass();
}

@Override
public Object getFunctionInstance() {
return functionInstance;
}

@Override
public void setFunctionInstance(Object obj) {
this.functionInstance = obj;
}

private static final DataOperations<ExecutionContext, Object> EXECONTEXT_DATA_OPERATIONS = new DataOperations<>();
static {
EXECONTEXT_DATA_OPERATIONS.addGenericOperation(ExecutionContext.class, DataOperations::generalAssignment);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -80,7 +81,7 @@ public Optional<TypedData> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ public interface JavaMethodExecutor {
ParameterResolver getOverloadResolver();

void execute(ExecutionContextDataSource executionContextDataSource) throws Exception;

Class<?> getContainingClass();

ClassLoader getClassLoader();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -18,7 +18,7 @@ public InvocationChain(List<FunctionWorkerMiddleware> middlewareList) {
}

@Override
public void doNext(ExecutionContext context) throws Exception{
public void doNext(MiddlewareExecutionContext context) throws Exception{
while (middlewareIterator.hasNext()) {
middlewareIterator.next().invoke(context, this);
}
Expand Down