diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java similarity index 97% rename from spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistry.java rename to spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java index c2d5b0963..60ed53fda 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java @@ -35,11 +35,13 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.cloud.function.context.AbstractSpringFunctionAdapterInitializer; +import org.springframework.cloud.function.context.FunctionCatalog; import org.springframework.cloud.function.context.FunctionRegistration; import org.springframework.cloud.function.context.FunctionRegistry; import org.springframework.cloud.function.context.FunctionType; @@ -58,11 +60,14 @@ import org.springframework.util.MimeType; import org.springframework.util.StringUtils; /** + * Implementation of {@link FunctionRegistry} and {@link FunctionCatalog} which is aware of the + * underlying {@link BeanFactory} to access available functions. Functions that are registered via + * {@link #register(FunctionRegistration)} operation are stored/cached locally. * * @author Oleg Zhurakousky - * + * @since 3.0 */ -public class LazyFunctionRegistry +public class BeanFactoryAwareFunctionRegistry implements FunctionRegistry, FunctionInspector, ApplicationContextAware, SmartInitializingSingleton { private static Log logger = LogFactory.getLog(AbstractSpringFunctionAdapterInitializer.class); @@ -77,7 +82,7 @@ public class LazyFunctionRegistry private final CompositeMessageConverter messageConverter; - public LazyFunctionRegistry(ConversionService conversionService, + public BeanFactoryAwareFunctionRegistry(ConversionService conversionService, @Nullable CompositeMessageConverter messageConverter) { this.conversionService = conversionService; this.messageConverter = messageConverter; diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java index 817371985..32dc214d2 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java @@ -53,9 +53,9 @@ import org.springframework.cloud.function.context.FunctionRegistration; import org.springframework.cloud.function.context.FunctionRegistry; import org.springframework.cloud.function.context.FunctionType; import org.springframework.cloud.function.context.catalog.AbstractComposableFunctionRegistry; +import org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry; import org.springframework.cloud.function.context.catalog.FunctionInspector; import org.springframework.cloud.function.context.catalog.FunctionUnregistrationEvent; -import org.springframework.cloud.function.context.catalog.LazyFunctionRegistry; import org.springframework.cloud.function.json.GsonMapper; import org.springframework.cloud.function.json.JacksonMapper; import org.springframework.context.ApplicationEventPublisher; @@ -107,7 +107,7 @@ public class ContextFunctionCatalogAutoConfiguration { messageConverters.add(new StringMessageConverter()); messageConverter = new CompositeMessageConverter(messageConverters); } - return new LazyFunctionRegistry(conversionService, messageConverter); + return new BeanFactoryAwareFunctionRegistry(conversionService, messageConverter); } @Bean(RoutingFunction.FUNCTION_NAME) diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistryMultiInOutTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java similarity index 99% rename from spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistryMultiInOutTests.java rename to spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java index 6f57d0a83..4f983821e 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistryMultiInOutTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java @@ -55,7 +55,7 @@ import org.springframework.util.MimeTypeUtils; * @author Oleg Zhurakousky * */ -public class LazyFunctionRegistryMultiInOutTests { +public class BeanFactoryAwareFunctionRegistryMultiInOutTests { private FunctionCatalog configureCatalog() { ApplicationContext context = new SpringApplicationBuilder(SampleFunctionConfiguration.class) diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java similarity index 91% rename from spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistryTests.java rename to spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java index 392f3b1a2..d394b2348 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/LazyFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java @@ -30,9 +30,6 @@ import reactor.util.function.Tuple2; import reactor.util.function.Tuple3; import reactor.util.function.Tuples; - - - import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.function.context.FunctionCatalog; @@ -48,7 +45,7 @@ import static org.junit.Assert.fail; * @author Oleg Zhurakousky * */ -public class LazyFunctionRegistryTests { +public class BeanFactoryAwareFunctionRegistryTests { private FunctionCatalog configureCatalog() { ApplicationContext context = new SpringApplicationBuilder(SampleFunctionConfiguration.class) @@ -70,17 +67,6 @@ public class LazyFunctionRegistryTests { assertThat(result.get(1)).isEqualTo("UPPERCASEFLUX2"); } - - @Test - public void testSerializationDeserialization() { - FunctionCatalog catalog = this.configureCatalog(); - - //Function asIs = catalog.lookup("uppercase", new ); - - //ParameterizedType -// - } - /* * When invoking imperative function as reactive the rules are * - the input wrapper must match the output wrapper (e.g., or ) @@ -167,13 +153,10 @@ public class LazyFunctionRegistryTests { @Test public void testCompositionSupplierAndFunction() { FunctionCatalog catalog = this.configureCatalog(); -// Supplier numberSupplier = catalog.lookup("numberword|uppercase"); -// String result = numberSupplier.get(); -// System.out.println(result); Supplier> numberSupplierFlux = catalog.lookup("numberword|uppercaseFlux"); String result = numberSupplierFlux.get().blockFirst(); - System.out.println(result); + assertThat(result).isEqualTo("ONE"); } /* @@ -203,6 +186,7 @@ public class LazyFunctionRegistryTests { FunctionCatalog catalog = this.configureCatalog(); Function, Mono> monoToMono = catalog.lookup("monoVoidToMonoVoid"); Void block = monoToMono.apply(Mono.empty()).block(); + assertThat(block).isNull(); } // MULTI INPUT/OUTPUT @@ -216,7 +200,10 @@ public class LazyFunctionRegistryTests { Flux intStream = Flux.just(1, 2, 3); List result = multiInputFunction.apply(Tuples.of(stringStream, intStream)).collectList().block(); - System.out.println(result); + assertThat(result.size()).isEqualTo(3); + assertThat(result.get(0)).isEqualTo("one-1"); + assertThat(result.get(1)).isEqualTo("two-2"); + assertThat(result.get(2)).isEqualTo("three-3"); } @@ -229,7 +216,10 @@ public class LazyFunctionRegistryTests { Flux intStream = Flux.just("1", "2", "3"); List result = multiInputFunction.apply(Tuples.of(stringStream, intStream)).collectList().block(); - System.out.println(result); + assertThat(result.size()).isEqualTo(3); + assertThat(result.get(0)).isEqualTo("ONE-1"); + assertThat(result.get(1)).isEqualTo("TWO-2"); + assertThat(result.get(2)).isEqualTo("THREE-3"); } @@ -238,9 +228,10 @@ public class LazyFunctionRegistryTests { FunctionCatalog catalog = this.configureCatalog(); Function, Tuple3, Flux, Flux>> multiOutputFunction = catalog.lookup("multiOutputAsTuple"); - Flux personStream = Flux.just(new Person("Uncle Sam", 1), new Person("Uncle Pierre", 2)); + Flux personStream = Flux.just(new Person("Uncle Sam", 1), new Person("Oncle Pierre", 2)); Tuple3, Flux, Flux> result = multiOutputFunction.apply(personStream); + result.getT1().subscribe(v -> System.out.println("=> 1: " + v)); result.getT2().subscribe(v -> System.out.println("=> 2: " + v)); result.getT3().subscribe(v -> System.out.println("=> 3: " + v)); @@ -417,22 +408,4 @@ public class LazyFunctionRegistryTests { return "Person: " + name + "/" + id; } } - -// System.out.println("==\n"); -// -// Consumer consumer = catalog.lookup("consumer"); -// consumer.accept("consumer"); -// System.out.println("==\n"); -// -// Consumer> fluxConsumer = catalog.lookup("consumer"); -// fluxConsumer.accept(Flux.just("fluxConsumer")); -// System.out.println("==\n"); -// -// Function consumerAsFunction = catalog.lookup("consumer"); -// System.out.println(consumerAsFunction.apply("consumerAsFunction")); -// System.out.println("==\n"); -// -// Function, Mono> consumerAsFluxFunction = catalog.lookup("consumer"); -// consumerAsFluxFunction.apply(Flux.just("consumerAsFluxFunction", "consumerAsFluxFunction2")).subscribe(); -// System.out.println("==\n"); } diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java index 83ca9ad97..dea937f9f 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/RequestProcessor.java @@ -39,8 +39,8 @@ import reactor.core.publisher.Mono; import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.function.context.FunctionCatalog; +import org.springframework.cloud.function.context.catalog.BeanFactoryAwareFunctionRegistry.FunctionInvocationWrapper; import org.springframework.cloud.function.context.catalog.FunctionInspector; -import org.springframework.cloud.function.context.catalog.LazyFunctionRegistry.FunctionInvocationWrapper; import org.springframework.cloud.function.context.config.RoutingFunction; import org.springframework.cloud.function.context.message.MessageUtils; import org.springframework.cloud.function.core.FluxConsumer;