Renamed new registry implementation to BeanFactoryAwareFunctionRegistry

- added initila javadoc
- polished few tests
This commit is contained in:
Oleg Zhurakousky
2019-07-17 14:48:05 +02:00
parent 2c8f3644da
commit fbeee8bc37
5 changed files with 25 additions and 47 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -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)

View File

@@ -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<byte[], byte[]> 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., <Flux, Flux> or <Mono, Mono>)
@@ -167,13 +153,10 @@ public class LazyFunctionRegistryTests {
@Test
public void testCompositionSupplierAndFunction() {
FunctionCatalog catalog = this.configureCatalog();
// Supplier<String> numberSupplier = catalog.lookup("numberword|uppercase");
// String result = numberSupplier.get();
// System.out.println(result);
Supplier<Flux<String>> 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<Void>, Mono<Void>> 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<Integer> intStream = Flux.just(1, 2, 3);
List<String> 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<String> intStream = Flux.just("1", "2", "3");
List<String> 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<Flux<Person>, Tuple3<Flux<Person>, Flux<String>, Flux<Integer>>> multiOutputFunction =
catalog.lookup("multiOutputAsTuple");
Flux<Person> personStream = Flux.just(new Person("Uncle Sam", 1), new Person("Uncle Pierre", 2));
Flux<Person> personStream = Flux.just(new Person("Uncle Sam", 1), new Person("Oncle Pierre", 2));
Tuple3<Flux<Person>, Flux<String>, Flux<Integer>> 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<String> consumer = catalog.lookup("consumer");
// consumer.accept("consumer");
// System.out.println("==\n");
//
// Consumer<Flux<String>> fluxConsumer = catalog.lookup("consumer");
// fluxConsumer.accept(Flux.just("fluxConsumer"));
// System.out.println("==\n");
//
// Function<String, Void> consumerAsFunction = catalog.lookup("consumer");
// System.out.println(consumerAsFunction.apply("consumerAsFunction"));
// System.out.println("==\n");
//
// Function<Flux<String>, Mono<Void>> consumerAsFluxFunction = catalog.lookup("consumer");
// consumerAsFluxFunction.apply(Flux.just("consumerAsFluxFunction", "consumerAsFluxFunction2")).subscribe();
// System.out.println("==\n");
}