Only expose Publisher via FunctionCatalog

Flux.from() is cheap and can be used to marshal the inputs everywhere
internally. With this change users ought to be able to register any
function of any Publisher type.
This commit is contained in:
Dave Syer
2018-05-01 11:46:29 -04:00
parent fb04324ac9
commit b59b43ddc5
14 changed files with 81 additions and 59 deletions

View File

@@ -23,6 +23,8 @@ import java.util.List;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
/**
@@ -43,13 +45,13 @@ public class SpringBootRequestHandler<E, O> extends SpringFunctionInitializer
public Object handleRequest(E event, Context context) {
initialize();
Object input = convertEvent(event);
Flux<?> output = apply(extract(input));
Publisher<?> output = apply(extract(input));
return result(input, output);
}
private Object result(Object input, Flux<?> output) {
private Object result(Object input, Publisher<?> output) {
List<O> result = new ArrayList<>();
for (Object value : output.toIterable()) {
for (Object value : Flux.from(output).toIterable()) {
result.add(convertOutput(value));
}
if (isSingleValue(input) && result.size() == 1) {

View File

@@ -27,6 +27,8 @@ import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.reactivestreams.Publisher;
import org.springframework.beans.factory.annotation.Autowired;
import reactor.core.publisher.Flux;
@@ -53,13 +55,13 @@ public class SpringBootStreamHandler extends SpringFunctionInitializer
throws IOException {
initialize();
Object value = convertStream(input);
Flux<?> flux = apply(extract(value));
Publisher<?> flux = apply(extract(value));
mapper.writeValue(output, result(value, flux));
}
private Object result(Object input, Flux<?> flux) {
private Object result(Object input, Publisher<?> flux) {
List<Object> result = new ArrayList<>();
for (Object value : flux.toIterable()) {
for (Object value : Flux.from(flux).toIterable()) {
result.add(value);
}
if (isSingleValue(input) && result.size()==1) {

View File

@@ -50,11 +50,11 @@ public class SpringFunctionInitializer implements Closeable {
private final Class<?> configurationClass;
private Function<Flux<?>, Publisher<?>> function;
private Function<Publisher<?>, Publisher<?>> function;
private Consumer<Flux<?>> consumer;
private Consumer<Publisher<?>> consumer;
private Supplier<Flux<?>> supplier;
private Supplier<Publisher<?>> supplier;
private AtomicBoolean initialized = new AtomicBoolean();
@@ -146,7 +146,7 @@ public class SpringFunctionInitializer implements Closeable {
: (this.consumer != null ? this.consumer : this.supplier);
}
protected Flux<?> apply(Flux<?> input) {
protected Publisher<?> apply(Publisher<?> input) {
if (this.function != null) {
return Flux.from(function.apply(input));
}

View File

@@ -53,7 +53,7 @@ public class SpringFunctionInitializerTests {
public void functionBean() {
initializer = new SpringFunctionInitializer(FluxFunctionConfig.class);
initializer.initialize();
Flux<?> result = initializer.apply(Flux.just(new Foo()));
Flux<?> result = Flux.from(initializer.apply(Flux.just(new Foo())));
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
}
@@ -61,7 +61,7 @@ public class SpringFunctionInitializerTests {
public void functionCatalog() {
initializer = new SpringFunctionInitializer(FunctionConfig.class);
initializer.initialize();
Flux<?> result = initializer.apply(Flux.just(new Foo()));
Flux<?> result = Flux.from(initializer.apply(Flux.just(new Foo())));
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
}
@@ -70,7 +70,7 @@ public class SpringFunctionInitializerTests {
initializer = new SpringFunctionInitializer(NamedFunctionConfig.class);
System.setProperty("function.name", "other");
initializer.initialize();
Flux<?> result = initializer.apply(Flux.just(new Foo()));
Flux<?> result = Flux.from(initializer.apply(Flux.just(new Foo())));
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
}
@@ -78,7 +78,7 @@ public class SpringFunctionInitializerTests {
public void consumerCatalog() {
initializer = new SpringFunctionInitializer(ConsumerConfig.class);
initializer.initialize();
Flux<?> result = initializer.apply(Flux.just(new Foo()));
Flux<?> result = Flux.from(initializer.apply(Flux.just(new Foo())));
assertThat(result.toStream().collect(Collectors.toList())).isEmpty();
}
@@ -86,7 +86,7 @@ public class SpringFunctionInitializerTests {
public void supplierCatalog() {
initializer = new SpringFunctionInitializer(SupplierConfig.class);
initializer.initialize();
Flux<?> result = initializer.apply(Flux.empty());
Flux<?> result = Flux.from(initializer.apply(Flux.empty()));
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
}