diff --git a/docs/src/main/asciidoc/adapters/azure-intro.adoc b/docs/src/main/asciidoc/adapters/azure-intro.adoc index c9760b989..fa46f7b81 100644 --- a/docs/src/main/asciidoc/adapters/azure-intro.adoc +++ b/docs/src/main/asciidoc/adapters/azure-intro.adoc @@ -22,6 +22,25 @@ This Azure handler will delegate to a `Function` bean (or a `Function

uppercase(ExecutionContext targetContext) { + return foo -> { + targetContext.getLogger().info("Invoking 'uppercase' on " + foo.getValue()); + return new Bar(foo.getValue().toUpperCase()); + }; +} +``` +Normally type-based injection should suffice, however if need to you can also utilise the bean name under which it is registered which is `targetExecutionContext`. + + === Notes on JAR Layout You don't need the Spring Cloud Function Web at runtime in Azure, so you can exclude this before you create the JAR you deploy to Azure, but it won't be used if you include it so it doesn't hurt to leave it in. A function application on Azure is an archive generated by the Maven plugin. The function lives in the JAR file generated by this project. The sample creates it as an executable jar, using the thin layout, so that Azure can find the handler classes. If you prefer you can just use a regular flat JAR file. The dependencies should *not* be included. diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java index 04f98e2c1..c0f6feafb 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandlerTests.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; +import com.microsoft.azure.functions.ExecutionContext; import org.junit.After; import org.junit.Test; import reactor.core.publisher.Flux; @@ -151,8 +152,11 @@ public class AzureSpringBootRequestHandlerTests { protected static class AutoConfig { @Bean - public Function uppercase() { - return foo -> new Bar(foo.getValue().toUpperCase()); + public Function uppercase(ExecutionContext targetContext) { + return foo -> { + targetContext.getLogger().info("Invoking 'uppercase' on " + foo.getValue()); + return new Bar(foo.getValue().toUpperCase()); + }; } } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java index bf8abc75e..07e9e9832 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java @@ -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 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> function; @@ -102,6 +109,8 @@ public abstract class AbstractSpringFunctionAdapterInitializer 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 implements Clo } } + private void registerTargetContext(C targetContext, SpringApplication builder) { + if (targetContext != null) { + builder.addInitializers(new ApplicationContextInitializer() { + @SuppressWarnings("unchecked") + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + ((GenericApplicationContext) applicationContext).registerBean(TARGET_EXECUTION_CTX_BEAN_NAME, + (Class) targetContext.getClass(), (Supplier) () -> targetContext); + } + }); + } + } + protected FunctionInspector getInspector() { return inspector; }