While downloading azure blob using sas url return 200 with an exception

67 Views Asked by At

Error:

org.springframework.web.reactive.function.client.WebClientResponseException: 200 OK from GET https://xxxxx.blob.core.windows.net/yyyy/65c18c2afb432c02ba0e0584/file.vmdk?sastoken; nested 
org.springframework.web.reactive.function.client.WebClientResponseException: 200 OK from GEThttps://xxxxx.blob.core.windows.net/yyyy/65c18c2afb432c02ba0e0584/file.vmdk?sastoken nested exception is io.netty.handler.timeout.ReadTimeoutException
        at org.springframework.web.reactive.function.client.WebClientResponseException.create(WebClientResponseException.java:250)
        at org.springframework.web.reactive.function.client.DefaultClientResponse.lambda$createException$1(DefaultClientResponse.java:207)
        at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:106)
        at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onError(FluxOnErrorReturn.java:199)
        at reactor.core.publisher.Operators$MonoSubscriber.onError(Operators.java:1886)
        at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544)
        at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onError(FluxMapFuseable.java:142)
        at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121)
        at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onError(FluxMapFuseable.java:340)
        at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onError(FluxFilterFuseable.java:382)
        at reactor.core.publisher.MonoCollect$CollectSubscriber.onError(MonoCollect.java:145)
        at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121)
        at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544)
        at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:265)
        at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onError(FluxPeekFuseable.java:903)
        at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:265)
        at reactor.core.publisher.Operators.error(Operators.java:198)
        at reactor.netty.channel.FluxReceive.startReceiver(FluxReceive.java:177)
        at reactor.netty.channel.FluxReceive.subscribe(FluxReceive.java:147)
        at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
        at reactor.netty.ByteBufFlux.subscribe(ByteBufFlux.java:340)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4490)
        at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
        at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544)
        at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onError(FluxContextWrite.java:121)
        at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onError(FluxOnAssembly.java:544)
        at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:265)
        at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onError(FluxPeekFuseable.java:903)
        at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onError(FluxMap.java:265)
        at reactor.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:480)
        at reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:275)
        at reactor.netty.channel.FluxReceive.onInboundError(FluxReceive.java:468)
        at reactor.netty.channel.ChannelOperations.onInboundError(ChannelOperations.java:508)
        at reactor.netty.channel.ChannelOperationsHandler.exceptionCaught(ChannelOperationsHandler.java:145)
        at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:346)
        at io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught(AbstractChannelHandlerContext.java:325)
        at io.netty.channel.AbstractChannelHandlerContext.fireExceptionCaught(AbstractChannelHandlerContext.java:317)
        at io.netty.handler.timeout.ReadTimeoutHandler.readTimedOut(ReadTimeoutHandler.java:98)
        at io.netty.handler.timeout.ReadTimeoutHandler.channelIdle(ReadTimeoutHandler.java:90)
        at io.netty.handler.timeout.IdleStateHandler$ReaderIdleTimeoutTask.run(IdleStateHandler.java:503)
        at io.netty.handler.timeout.IdleStateHandler$AbstractIdleTask.run(IdleStateHandler.java:475)
        at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
        at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:153)
        at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:416)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Unknown Source)

The read write and idle handler is using 5 minutes, but this issue is seen intermittently and fails with the above error. Webclient used:

`@Bean
public WebClient webClient() {
    TcpClient tcpClient = TcpClient
            .create()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, clientConnectTimeout)
            .secure( s -> {
                try {
                    //some ssl context

                    s.sslContext(context);
                } catch (Exception e) {
                    log.error("Exception occurred in webclient ssl context", e);
                }
            })
            .doOnConnected(connection -> {
                final ChannelPipeline pipeline = connection.channel().pipeline();
                if (pipeline.context("idleStateHandler") == null) {
                    pipeline.addLast("idleStateHandler", new IdleStateHandler(0, 0, idleTimeoutSeconds));
                }
                connection.addHandlerLast(new ReadTimeoutHandler(clientReadTimeout, TimeUnit.MILLISECONDS));
                connection.addHandlerLast(new WriteTimeoutHandler(clientWriteTimeout, TimeUnit.MILLISECONDS));
            });

    HttpClient httpClient = HttpClient.from(tcpClient);

    ClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);

    return WebClient.builder()
            .clientConnector(connector)
            .exchangeStrategies(ExchangeStrategies.builder()
                    .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(BUFFER_SIZE)) // BUFFER_SIZE: 16MB
                    .build())
            .defaultHeader(javax.ws.rs.core.HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .build();
}

`

0

There are 0 best solutions below