GH-252 Added support for non-fluxed functions

Added support for non-fluxed functions to Azure and AWS adapters
Resolves #252
This commit is contained in:
Oleg Zhurakousky
2019-02-25 17:16:03 +01:00
parent 757600171d
commit 989f205d36
5 changed files with 72 additions and 7 deletions

View File

@@ -19,6 +19,7 @@ package org.springframework.cloud.function.adapter.azure;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
@@ -36,12 +37,16 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.function.context.FunctionCatalog;
import org.springframework.cloud.function.context.FunctionRegistration;
import org.springframework.cloud.function.context.FunctionType;
import org.springframework.cloud.function.context.catalog.FunctionInspector;
import org.springframework.cloud.function.context.config.FunctionContextUtils;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.util.ClassUtils;
/**
* @author Soby Chacko
* @author Oleg Zhurakousky
*/
public class AzureSpringFunctionInitializer implements Closeable {
@@ -125,7 +130,6 @@ public class AzureSpringFunctionInitializer implements Closeable {
}
}
@SuppressWarnings("unchecked")
protected void initialize(ExecutionContext ctxt) {
ConfigurableApplicationContext context = AzureSpringFunctionInitializer.context;
@@ -164,7 +168,7 @@ public class AzureSpringFunctionInitializer implements Closeable {
ctxt.getLogger()
.info("No catalog. Looking for Function bean name=" + name);
}
this.function = context.getBean(name, Function.class);
this.function = getAndInstrumentFromContext(context, name);
}
}
else {
@@ -179,6 +183,18 @@ public class AzureSpringFunctionInitializer implements Closeable {
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private <T> T getAndInstrumentFromContext(
ConfigurableApplicationContext applicationContext, String name) {
FunctionRegistration<?> functionRegistration = new FunctionRegistration(
applicationContext.getBean(name), name);
Type type = FunctionContextUtils.findType(name,
applicationContext.getBeanFactory());
FunctionType functionType = new FunctionType(type);
return (T) functionRegistration.type(functionType).wrap().getTarget();
}
private SpringApplication springApplication() {
Class<?> sourceClass = this.configurationClass;
SpringApplication application = new org.springframework.cloud.function.context.FunctionalSpringApplication(

View File

@@ -29,6 +29,7 @@ import org.springframework.cloud.function.context.FunctionRegistration;
import org.springframework.cloud.function.context.FunctionType;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.GenericApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
@@ -82,6 +83,14 @@ public class AzureSpringFunctionInitializerTests {
assertThat(bar.getValue()).isEqualTo("BAR");
}
@Test
public void functionNonFluxBean() {
AzureSpringFunctionInitializer handler = handler(NonFluxFunctionConfig.class);
handler.initialize(new TestExecutionContext("function"));
Flux<?> result = Flux.from(handler.getFunction().apply(Flux.just(new Foo())));
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
}
@SpringBootConfiguration
@EnableAutoConfiguration
protected static class BareConfig {
@@ -121,4 +130,14 @@ public class AzureSpringFunctionInitializerTests {
}
@Configuration
protected static class NonFluxFunctionConfig {
@Bean
public Function<Foo, Bar> function() {
return foo -> new Bar();
}
}
}