77import java .util .*;
88import java .util .concurrent .ConcurrentHashMap ;
99
10+ import com .google .gson .Gson ;
1011import com .microsoft .azure .functions .internal .spi .middleware .Middleware ;
1112import com .microsoft .azure .functions .rpc .messages .*;
1213import com .microsoft .azure .functions .spi .inject .FunctionInstanceInjector ;
14+ import com .microsoft .azure .functions .spi .inject .GsonInstanceInjector ;
1315import com .microsoft .azure .functions .worker .Constants ;
16+ import com .microsoft .azure .functions .worker .Util ;
1417import com .microsoft .azure .functions .worker .WorkerLogManager ;
1518import com .microsoft .azure .functions .worker .binding .BindingDataStore ;
1619import com .microsoft .azure .functions .worker .binding .ExecutionContextDataSource ;
@@ -38,7 +41,7 @@ public class JavaFunctionBroker {
3841 private volatile FunctionInstanceInjector functionInstanceInjector ;
3942 private final Object oneTimeLogicInitializationLock = new Object ();
4043
41- private FunctionInstanceInjector newInstanceInjector () {
44+ private FunctionInstanceInjector newFunctionInstanceInjector () {
4245 return new FunctionInstanceInjector () {
4346 @ Override
4447 public <T > T getInstance (Class <T > functionClass ) throws Exception {
@@ -53,20 +56,20 @@ public JavaFunctionBroker(ClassLoaderProvider classLoaderProvider) {
5356 }
5457
5558 public void loadMethod (FunctionMethodDescriptor descriptor , Map <String , BindingInfo > bindings )
56- throws ClassNotFoundException , NoSuchMethodException , IOException {
59+ throws Exception {
5760 descriptor .validate ();
5861 addSearchPathsToClassLoader (descriptor );
5962 initializeOneTimeLogics ();
6063 FunctionDefinition functionDefinition = new FunctionDefinition (descriptor , bindings , classLoaderProvider );
6164 this .methods .put (descriptor .getId (), new ImmutablePair <>(descriptor .getName (), functionDefinition ));
6265 }
6366
64- private void initializeOneTimeLogics () {
67+ private void initializeOneTimeLogics () throws Exception {
6568 if (!oneTimeLogicInitialized ) {
6669 synchronized (oneTimeLogicInitializationLock ) {
6770 if (!oneTimeLogicInitialized ) {
6871 initializeInvocationChainFactory ();
69- initializeFunctionInstanceInjector ();
72+ initializeInstanceInjector ();
7073 oneTimeLogicInitialized = true ;
7174 }
7275 }
@@ -90,28 +93,45 @@ private void initializeInvocationChainFactory() {
9093 this .invocationChainFactory = new InvocationChainFactory (middlewares );
9194 }
9295
93- private void initializeFunctionInstanceInjector () {
96+ private void initializeInstanceInjector () throws Exception {
9497 ClassLoader prevContextClassLoader = Thread .currentThread ().getContextClassLoader ();
9598 try {
9699 //ServiceLoader will use thread context classloader to verify loaded class
97100 Thread .currentThread ().setContextClassLoader (classLoaderProvider .createClassLoader ());
98- Iterator <FunctionInstanceInjector > iterator = ServiceLoader .load (FunctionInstanceInjector .class ).iterator ();
99- if (iterator .hasNext ()) {
100- this .functionInstanceInjector = iterator .next ();
101- WorkerLogManager .getSystemLogger ().info ("Load function instance injector: " + this .functionInstanceInjector .getClass ().getName ());
102- if (iterator .hasNext ()){
103- WorkerLogManager .getSystemLogger ().warning ("Customer function app has multiple FunctionInstanceInjector implementations." );
104- throw new RuntimeException ("Customer function app has multiple FunctionInstanceInjector implementations" );
105- }
106- }else {
107- this .functionInstanceInjector = newInstanceInjector ();
108- WorkerLogManager .getSystemLogger ().info ("Didn't find any function instance injector, creating function class instance every invocation." );
109- }
101+ loadFunctionInstanceInjector ();
102+ loadGsonInstanceInjector ();
110103 } finally {
111104 Thread .currentThread ().setContextClassLoader (prevContextClassLoader );
112105 }
113106 }
114107
108+ private void loadFunctionInstanceInjector () {
109+ Iterator <FunctionInstanceInjector > iterator = ServiceLoader .load (FunctionInstanceInjector .class ).iterator ();
110+ if (iterator .hasNext ()) {
111+ this .functionInstanceInjector = iterator .next ();
112+ WorkerLogManager .getSystemLogger ().info ("Load function instance injector: " + this .functionInstanceInjector .getClass ().getName ());
113+ if (iterator .hasNext ()){
114+ WorkerLogManager .getSystemLogger ().warning ("Customer function app has multiple FunctionInstanceInjector implementations." );
115+ throw new RuntimeException ("Customer function app has multiple FunctionInstanceInjector implementations" );
116+ }
117+ }else {
118+ this .functionInstanceInjector = newFunctionInstanceInjector ();
119+ WorkerLogManager .getSystemLogger ().info ("Didn't find any function instance injector, creating function class instance every invocation." );
120+ }
121+ }
122+
123+ private void loadGsonInstanceInjector () throws Exception {
124+ Iterator <GsonInstanceInjector > iterator = ServiceLoader .load (GsonInstanceInjector .class ).iterator ();
125+ if (iterator .hasNext ()) {
126+ GsonInstanceInjector gsonInstanceInjector = iterator .next ();
127+ Util .setGsonInstance (gsonInstanceInjector .getGsonInstance ());
128+ WorkerLogManager .getSystemLogger ().info ("Load gson instance injector: " + gsonInstanceInjector .getClass ().getName ());
129+ }else {
130+ Util .setGsonInstance (new Gson ());
131+ WorkerLogManager .getSystemLogger ().info ("Didn't find any gson instance injector, creating function class instance every invocation." );
132+ }
133+ }
134+
115135 private FunctionExecutionMiddleware getFunctionExecutionMiddleWare () {
116136 FunctionExecutionMiddleware functionExecutionMiddleware = new FunctionExecutionMiddleware (
117137 JavaMethodExecutors .createJavaMethodExecutor (this .classLoaderProvider .createClassLoader ()));
0 commit comments