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:
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@ import java.util.List;
|
||||
|
||||
import com.microsoft.azure.serverless.functions.ExecutionContext;
|
||||
|
||||
import org.reactivestreams.Publisher;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
/**
|
||||
@@ -44,7 +46,7 @@ public class AzureSpringBootRequestHandler<I, O> extends AzureSpringFunctionInit
|
||||
initialize(context);
|
||||
|
||||
Object convertedEvent = convertEvent(foo);
|
||||
Flux<?> output = apply(extract(convertedEvent));
|
||||
Publisher<?> output = apply(extract(convertedEvent));
|
||||
return result(convertedEvent, output);
|
||||
}
|
||||
|
||||
@@ -59,9 +61,9 @@ public class AzureSpringBootRequestHandler<I, O> extends AzureSpringFunctionInit
|
||||
return Flux.just(input);
|
||||
}
|
||||
|
||||
private O result(Object input, Flux<?> output) {
|
||||
private O result(Object input, Publisher<?> output) {
|
||||
List<Object> 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) {
|
||||
|
||||
@@ -28,7 +28,8 @@ import java.util.function.Function;
|
||||
import java.util.jar.Manifest;
|
||||
|
||||
import com.microsoft.azure.serverless.functions.ExecutionContext;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.reactivestreams.Publisher;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
@@ -37,12 +38,14 @@ import org.springframework.cloud.function.context.FunctionCatalog;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
/**
|
||||
* @author Soby Chacko
|
||||
*/
|
||||
public class AzureSpringFunctionInitializer implements Closeable {
|
||||
|
||||
private Function<Flux<?>, Flux<?>> function;
|
||||
private Function<Publisher<?>, Publisher<?>> function;
|
||||
|
||||
private AtomicBoolean initialized = new AtomicBoolean();
|
||||
|
||||
@@ -110,7 +113,7 @@ public class AzureSpringFunctionInitializer implements Closeable {
|
||||
}
|
||||
}
|
||||
|
||||
protected Flux<?> apply(Flux<?> input) {
|
||||
protected Publisher<?> apply(Publisher<?> input) {
|
||||
if (this.function != null) {
|
||||
return function.apply(input);
|
||||
}
|
||||
|
||||
@@ -16,17 +16,24 @@
|
||||
|
||||
package org.springframework.cloud.function.adapter.openwhisk;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.reactivestreams.Publisher;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import java.util.*;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
/**
|
||||
* @author Mark Fisher
|
||||
@@ -55,15 +62,15 @@ public class OpenWhiskActionHandler extends OpenWhiskFunctionInitializer {
|
||||
Object input = convertEvent(request.getValue());
|
||||
Object result = NO_INPUT_PROVIDED;
|
||||
if(input !=null ) {
|
||||
Flux<?> output = apply(extract(input));
|
||||
Publisher<?> output = apply(extract(input));
|
||||
result = result(input, output);
|
||||
}
|
||||
return serializeBody(result);
|
||||
}
|
||||
|
||||
private Object result(Object input, Flux<?> output) {
|
||||
private Object result(Object input, Publisher<?> output) {
|
||||
List<Object> result = new ArrayList<>();
|
||||
for (Object value : output.toIterable()) {
|
||||
for (Object value : Flux.from(output).toIterable()) {
|
||||
result.add(value);
|
||||
}
|
||||
if (isSingleValue(input) && result.size() == 1) {
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.function.Supplier;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.reactivestreams.Publisher;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cloud.function.context.FunctionCatalog;
|
||||
@@ -39,11 +40,11 @@ public class OpenWhiskFunctionInitializer {
|
||||
|
||||
private static Log logger = LogFactory.getLog(OpenWhiskFunctionInitializer.class);
|
||||
|
||||
private Function<Flux<?>, Flux<?>> 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();
|
||||
|
||||
@@ -86,7 +87,7 @@ public class OpenWhiskFunctionInitializer {
|
||||
: (this.consumer != null ? this.consumer : this.supplier);
|
||||
}
|
||||
|
||||
protected Flux<?> apply(Flux<?> input) {
|
||||
protected Publisher<?> apply(Publisher<?> input) {
|
||||
if (this.function != null) {
|
||||
return function.apply(input);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user