Попытка записать запрос и ответ при прокси-службе мыла с помощью облачного шлюза Spring.Ниже приведен фрагмент кода ... который вызывает исключение IllegalStateException.
java.lang.IllegalStateException: допускается только одно подключение для получения подписчика.в реакторе.netty.channel.FluxReceive.startReceiver (FluxReceive.java:271).: 121) [реактор-нетто-0.8.4.RELEASE.jar: 0.8.4.RELEASE]
--- Spring Versions ---
SpringBoot : 2.1.2.RELEASE
spring-cloud-gateway : 2.1.1.BUILD-SNAPSHOT
spring-boot-starter-webflux : 2.1.2.RELEASE
reactor-core : 3.2.5.RELEASE
GatewaySampleApplication
public class GatewaySampleApplication {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(
r ->
r.path("/security/getToken")
.filters( f -> f.preserveHostHeader()
.filter(new PolicyHandlerReactive()))
.uri("http://targetendpoint.xyz.com")
)
.build();
}
}
PolicyHandlerReactive:
PolicyHandlerReactive implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
ServerHttpRequest request = (ServerHttpRequest) exchange.getRequest();
Flux<DataBuffer> xmlReqFlux = request.getBody();
Mono<List<DataBuffer>> monoDataList = xmlReqFlux.collectList();
monoDataList.map(dataA -> logRequest2(dataA)).subscribe();
return chain.filter(exchange);
}
}
private List<DataBuffer> logRequest(List<DataBuffer> dataA) {
ListIterator<DataBuffer> dataAList = dataA.listIterator();
while(dataAList.hasNext() ) {
DataBuffer dataBuffer = dataAList.next();
InputStream is = dataBuffer.asInputStream();
System.out.println(convertStreamToString(is));
}
return dataA;
}