GH-265 Added support for injecting execution context

- Added support for injecting target execution context into the ApplicationContext in AbstractSpringFunctionAdapterInitializer, effectively making it available to all adapters (if one is provided)
- Added test, docs

Resolves #265
This commit is contained in:
Oleg Zhurakousky
2019-03-01 17:07:03 +01:00
parent 3f4401f9be
commit d20171d196
3 changed files with 47 additions and 2 deletions

View File

@@ -42,7 +42,9 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.cloud.function.context.catalog.FunctionInspector;
import org.springframework.cloud.function.context.config.FunctionContextUtils;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.util.ClassUtils;
/**
@@ -57,6 +59,11 @@ public abstract class AbstractSpringFunctionAdapterInitializer<C> implements Clo
private static Log logger = LogFactory.getLog(AbstractSpringFunctionAdapterInitializer.class);
/**
* Name of the bean for registering the target execution context passed to `initialize(context)` operation.
*/
public static final String TARGET_EXECUTION_CTX_BEAN_NAME = "targetExecutionContext";
private final Class<?> configurationClass;
private Function<Publisher<?>, Publisher<?>> function;
@@ -102,6 +109,8 @@ public abstract class AbstractSpringFunctionAdapterInitializer<C> implements Clo
}
logger.info("Initializing: " + this.configurationClass);
SpringApplication builder = springApplication();
this.registerTargetContext(targetContext, builder);
ConfigurableApplicationContext context = builder.run();
context.getAutowireCapableBeanFactory().autowireBean(this);
this.context = context;
@@ -113,6 +122,19 @@ public abstract class AbstractSpringFunctionAdapterInitializer<C> implements Clo
}
}
private void registerTargetContext(C targetContext, SpringApplication builder) {
if (targetContext != null) {
builder.addInitializers(new ApplicationContextInitializer<ConfigurableApplicationContext>() {
@SuppressWarnings("unchecked")
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
((GenericApplicationContext) applicationContext).registerBean(TARGET_EXECUTION_CTX_BEAN_NAME,
(Class<C>) targetContext.getClass(), (Supplier<C>) () -> targetContext);
}
});
}
}
protected FunctionInspector getInspector() {
return inspector;
}