GH-1919 Fix function+consumer composition

Ensured that when composing Function and Consumer no output binding is created. The initila fix was part of #1911 which addressed the reactive function/consumer combination. This fix does the same for imperative function/consumer combination

Resolves #1919
This commit is contained in:
Oleg Zhurakousky
2020-03-02 09:58:36 +01:00
parent e52266c01f
commit ad7bf9563f
2 changed files with 25 additions and 3 deletions

View File

@@ -657,9 +657,12 @@ public class FunctionConfiguration {
int outputCount = FunctionTypeUtils.getOutputCount(functionType);
if (!isSupplier && functionType instanceof ParameterizedType) {
Type outputType = ((ParameterizedType) functionType).getActualTypeArguments()[1];
if (FunctionTypeUtils.isMono(outputType) && outputType instanceof ParameterizedType
&& ((ParameterizedType) outputType).getActualTypeArguments()[0].getTypeName().endsWith("Void")) {
this.outputCount = 0;
if (FunctionTypeUtils.isOfType(outputType, Mono.class) && outputType instanceof ParameterizedType
&& FunctionTypeUtils.isOfType(((ParameterizedType) outputType).getActualTypeArguments()[0], Void.class)) {
outputCount = 0;
}
else if (FunctionTypeUtils.isOfType(outputType, Void.class)) {
outputCount = 0;
}
}
return outputCount;

View File

@@ -280,6 +280,24 @@ public class ImplicitFunctionBindingTests {
}
}
@Test
public void fooFunctionComposedWithConsumerNoOutputChannel() {
System.clearProperty("spring.cloud.function.definition");
try (ConfigurableApplicationContext context = new SpringApplicationBuilder(
TestChannelBinderConfiguration.getCompleteConfiguration(ReactiveFunctionConfiguration.class, SingleReactiveConsumerConfiguration.class))
.web(WebApplicationType.NONE).run("--spring.jmx.enabled=false", "--spring.cloud.function.definition=echo|consumer")) {
assertThat(context.containsBean("echoconsumer-out-0")).isFalse();
InputDestination inputDestination = context.getBean(InputDestination.class);
Message<byte[]> inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build();
inputDestination.send(inputMessage);
assertThat(System.getProperty("consumer")).isEqualTo("Hello");
System.clearProperty("consumer");
}
}
@Test
public void testReactiveConsumerWithoutDefinitionProperty() {
System.clearProperty("spring.cloud.function.definition");
@@ -685,6 +703,7 @@ public class ImplicitFunctionBindingTests {
TestChannelBinderConfiguration.getCompleteConfiguration(FunctionalConsumerConfiguration.class))
.web(WebApplicationType.NONE).run("--spring.jmx.enabled=false")) {
assertThat(context.containsBean("funcConsumer-out-0")).isFalse();
InputDestination inputDestination = context.getBean(InputDestination.class);
Message<byte[]> inputMessage = MessageBuilder.withPayload("Hello".getBytes()).build();
inputDestination.send(inputMessage);