Skip to content

Commit

Permalink
Revert "Set Thread context classloder for entire middleware chain (#717
Browse files Browse the repository at this point in the history
…)"

This reverts commit 5315874.
  • Loading branch information
ahmedmuhsin committed Aug 2, 2024
1 parent f0b7ff3 commit c1aae92
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.microsoft.azure.functions.worker.broker;

import com.microsoft.azure.functions.worker.binding.*;

/**
* Used to executor of arbitrary Java method in any JAR using reflection.
* Thread-Safety: Multiple thread.
*/
public class EnhancedJavaMethodExecutorImpl implements JavaMethodExecutor {

private final ClassLoader classLoader;

public EnhancedJavaMethodExecutorImpl(ClassLoader classLoader) {
this.classLoader = classLoader;
}

public void execute(ExecutionContextDataSource executionContextDataSource) throws Exception {
try {
Thread.currentThread().setContextClassLoader(this.classLoader);
Object retValue = ParameterResolver.resolveArguments(executionContextDataSource)
.orElseThrow(() -> new NoSuchMethodException("Cannot locate the method signature with the given input"))
.invoke(executionContextDataSource::getFunctionInstance);
executionContextDataSource.updateReturnValue(retValue);
} finally {
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,29 +113,20 @@ private void initializeFunctionInstanceInjector() {
}

private FunctionExecutionMiddleware getFunctionExecutionMiddleWare() {
FunctionExecutionMiddleware functionExecutionMiddleware = new FunctionExecutionMiddleware(JavaMethodExecutor.getInstance());
FunctionExecutionMiddleware functionExecutionMiddleware = new FunctionExecutionMiddleware(
JavaMethodExecutors.createJavaMethodExecutor(this.classLoaderProvider.createClassLoader()));
WorkerLogManager.getSystemLogger().info("Load last middleware: FunctionExecutionMiddleware");
return functionExecutionMiddleware;
}

public Optional<TypedData> invokeMethod(String id, InvocationRequest request, List<ParameterBinding> outputs)
throws Exception {
ExecutionContextDataSource executionContextDataSource = buildExecutionContext(id, request);
invoke(executionContextDataSource);
this.invocationChainFactory.create().doNext(executionContextDataSource);
outputs.addAll(executionContextDataSource.getDataStore().getOutputParameterBindings(true));
return executionContextDataSource.getDataStore().getDataTargetTypedValue(BindingDataStore.RETURN_NAME);
}

private void invoke(ExecutionContextDataSource executionContextDataSource) throws Exception {
ClassLoader prevContextClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(classLoaderProvider.createClassLoader());
this.invocationChainFactory.create().doNext(executionContextDataSource);
} finally {
Thread.currentThread().setContextClassLoader(prevContextClassLoader);
}
}

private ExecutionContextDataSource buildExecutionContext(String id, InvocationRequest request)
throws NoSuchMethodException {
ImmutablePair<String, FunctionDefinition> methodEntry = this.methods.get(id);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,14 @@
package com.microsoft.azure.functions.worker.broker;


import java.util.*;
import com.microsoft.azure.functions.worker.binding.*;


/**
* Used to executor of arbitrary Java method in any JAR using reflection.
* Thread-Safety: Multiple thread.
*/
public class JavaMethodExecutor {

private static final JavaMethodExecutor INSTANCE = new JavaMethodExecutor();

public static JavaMethodExecutor getInstance(){
return INSTANCE;
}

private JavaMethodExecutor() {}

public void execute(ExecutionContextDataSource executionContextDataSource) throws Exception {
Object retValue = ParameterResolver.resolveArguments(executionContextDataSource)
.orElseThrow(() -> new NoSuchMethodException("Cannot locate the method signature with the given input"))
.invoke(executionContextDataSource::getFunctionInstance);
executionContextDataSource.updateReturnValue(retValue);
}
public interface JavaMethodExecutor {
void execute(ExecutionContextDataSource executionContextDataSource) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.microsoft.azure.functions.worker.broker;

import com.microsoft.azure.functions.worker.binding.*;

/**
* Used to executor of arbitrary Java method in any JAR using reflection.
* Thread-Safety: Multiple thread.
*/
public class JavaMethodExecutorImpl implements JavaMethodExecutor {

private static final JavaMethodExecutorImpl INSTANCE = new JavaMethodExecutorImpl();

public static JavaMethodExecutorImpl getInstance(){
return INSTANCE;
}

private JavaMethodExecutorImpl () {}

public void execute(ExecutionContextDataSource executionContextDataSource) throws Exception {
Object retValue = ParameterResolver.resolveArguments(executionContextDataSource)
.orElseThrow(() -> new NoSuchMethodException("Cannot locate the method signature with the given input"))
.invoke(executionContextDataSource::getFunctionInstance);
executionContextDataSource.updateReturnValue(retValue);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.microsoft.azure.functions.worker.broker;

import com.microsoft.azure.functions.worker.WorkerLogManager;
import org.apache.commons.lang3.SystemUtils;

public class JavaMethodExecutors {
public static JavaMethodExecutor createJavaMethodExecutor(ClassLoader classLoader) {
if(SystemUtils.IS_JAVA_1_8) {
WorkerLogManager.getSystemLogger().info("Loading JavaMethodExecutorImpl");
return JavaMethodExecutorImpl.getInstance();
} else {
WorkerLogManager.getSystemLogger().info("Loading EnhancedJavaMethodExecutorImpl");
return new EnhancedJavaMethodExecutorImpl(classLoader);
}
}
}

0 comments on commit c1aae92

Please sign in to comment.