GH-434 Added generic FunctionInvoker for AWS

- Added generic FunctionInvoker capable of handling the request generically without requiring user to implemen specific AWS request handler

Resolves #434
This commit is contained in:
Oleg Zhurakousky
2019-12-05 19:28:54 +01:00
parent 0f38ea47b8
commit 52b0fdea50
15 changed files with 641 additions and 234 deletions

View File

@@ -79,6 +79,25 @@ public class BeanFactoryAwareFunctionRegistryMultiInOutTests {
System.out.println(result);
}
@Test
public void testMultiInputWithPojoConversion() {
FunctionCatalog catalog = this.configureCatalog();
Function<Tuple2<Flux<CartEvent>, Flux<CheckoutEvent>>, Flux<OrderEvent>> multiInputFunction =
catalog.lookup("thomas", "application/json");
CartEvent carEvent = new CartEvent();
carEvent.setCarEvent("carEvent");
Flux<CartEvent> carEventStream = Flux.just(carEvent);
CheckoutEvent checkoutEvent = new CheckoutEvent();
checkoutEvent.setCheckoutEvent("checkoutEvent");
Flux<CheckoutEvent> checkoutEventStream = Flux.just(checkoutEvent);
Tuple2<Flux<CartEvent>, Flux<CheckoutEvent>> streams = Tuples.of(carEventStream, checkoutEventStream);
List<OrderEvent> result = multiInputFunction.apply(streams).collectList().block();
System.out.println(result);
}
@SuppressWarnings("unused")
@Test
@Ignore
@@ -380,6 +399,56 @@ public class BeanFactoryAwareFunctionRegistryMultiInOutTests {
return new Flux[] { repeated, sum };
};
}
@Bean
public Function<Tuple2<Flux<CartEvent>, Flux<CheckoutEvent>>, Flux<OrderEvent>> thomas() {
return tuple -> {
Flux<CartEvent> cartEventStream = tuple.getT1();
Flux<CheckoutEvent> checkoutEventStream = tuple.getT2();
return Flux.zip(cartEventStream, checkoutEventStream, (cartEvent, checkoutEvent) -> {
OrderEvent oe = new OrderEvent();
oe.setOrderEvent(cartEvent.toString() + "- " + checkoutEvent.toString());
return oe;
});
};
}
}
public static class CartEvent {
private String carEvent;
public String getCarEvent() {
return carEvent;
}
public void setCarEvent(String carEvent) {
this.carEvent = carEvent;
}
}
public static class CheckoutEvent {
private String checkoutEvent;
public String getCheckoutEvent() {
return checkoutEvent;
}
public void setCheckoutEvent(String checkoutEvent) {
this.checkoutEvent = checkoutEvent;
}
}
public static class OrderEvent {
private String orderEvent;
public String getOrderEvent() {
return orderEvent;
}
public void setOrderEvent(String orderEvent) {
this.orderEvent = orderEvent;
}
}
public static class Person {

View File

@@ -66,7 +66,7 @@ public class BeanFactoryAwarePojoFunctionRegistryTests {
assertThat(f2message.apply(MessageBuilder.withPayload("message").build())).isEqualTo("MESSAGE");
Function<Message<String>, Message<byte[]>> f2messageReturned = catalog.lookup("myFunction", "application/json");
assertThat(new String(f2messageReturned.apply(MessageBuilder.withPayload("message").build()).getPayload())).isEqualTo("\"MESSAGE\"");
assertThat(new String(f2messageReturned.apply(MessageBuilder.withPayload("message").build()).getPayload())).isEqualTo("MESSAGE");
Function<Flux<String>, Flux<String>> f3 = catalog.lookup("myFunction");
assertThat(f3.apply(Flux.just("foo")).blockFirst()).isEqualTo("FOO");
@@ -89,7 +89,7 @@ public class BeanFactoryAwarePojoFunctionRegistryTests {
assertThat(f2message.apply(MessageBuilder.withPayload("message").build())).isEqualTo("MESSAGE");
Function<Message<String>, Message<byte[]>> f2messageReturned = catalog.lookup("myFunctionLike", "application/json");
assertThat(new String(f2messageReturned.apply(MessageBuilder.withPayload("message").build()).getPayload())).isEqualTo("\"MESSAGE\"");
assertThat(new String(f2messageReturned.apply(MessageBuilder.withPayload("message").build()).getPayload())).isEqualTo("MESSAGE");
Function<Flux<String>, Flux<String>> f3 = catalog.lookup("myFunctionLike");
assertThat(f3.apply(Flux.just("foo")).blockFirst()).isEqualTo("FOO");