Special handle for void in the RSocketOutGateway
To avoid extra `Publisher` subscription work in the target application "flatten" a returned empty `Flux` for the `void` expected type into a `Mono.empty()` for automatic subscription on the output channel
This commit is contained in:
committed by
Gary Russell
parent
c38da2f4ee
commit
fa1ab223ae
@@ -22,6 +22,7 @@ import java.util.Map;
|
||||
import org.reactivestreams.Publisher;
|
||||
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.core.ResolvableType;
|
||||
import org.springframework.expression.EvaluationContext;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.integration.expression.ExpressionUtils;
|
||||
@@ -38,6 +39,7 @@ import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.MimeType;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
/**
|
||||
@@ -298,12 +300,17 @@ public class RSocketOutboundGateway extends AbstractReplyProducingMessageHandler
|
||||
}
|
||||
case requestStream:
|
||||
case requestChannel:
|
||||
Flux<?> result;
|
||||
ResolvableType expectedType;
|
||||
if (expectedResponseType instanceof Class<?>) {
|
||||
return Mono.just(retrieveSpec.retrieveFlux((Class<?>) expectedResponseType));
|
||||
expectedType = ResolvableType.forClass((Class<?>) expectedResponseType);
|
||||
result = retrieveSpec.retrieveFlux((Class<?>) expectedResponseType);
|
||||
}
|
||||
else {
|
||||
return Mono.just(retrieveSpec.retrieveFlux((ParameterizedTypeReference<?>) expectedResponseType));
|
||||
expectedType = ResolvableType.forType((ParameterizedTypeReference<?>) expectedResponseType);
|
||||
result = retrieveSpec.retrieveFlux((ParameterizedTypeReference<?>) expectedResponseType);
|
||||
}
|
||||
return isVoid(expectedType) ? result.then() : Mono.just(result);
|
||||
default:
|
||||
throw new UnsupportedOperationException("Unsupported interaction model: " + interactionModel);
|
||||
}
|
||||
@@ -346,4 +353,8 @@ public class RSocketOutboundGateway extends AbstractReplyProducingMessageHandler
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isVoid(ResolvableType type) {
|
||||
return (Void.class.equals(type.resolve()) || void.class.equals(type.resolve()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user