首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么WebClient在这个网络流量应用程序中被阻塞?

为什么WebClient在这个网络流量应用程序中被阻塞?
EN

Stack Overflow用户
提问于 2021-02-07 17:37:31
回答 1查看 821关注 0票数 1

我正在开发一个web流量应用程序,它公开一个WebClient调用的http端点,然后修改WebClient调用的响应体,然后返回到客户端。当我启用封锁线时,我发现它阻塞了,我正在试图找出原因。

下面是我可以想出的用于重新创建行为的最简单的代码版本。我还在这里放置了一个工作项目:https://github.com/aztosca/web-client-test。注入的WebClient.Builder是他们推荐使用的Spring的预配置实例。

我认为阻塞狗抱怨是因为事件循环线程被阻塞了。我认为使用WebClient可以防止这种情况发生,并确保在适当的线程上发生任何阻塞,但在这里发生了一些我还不明白的事情(我是网络流量新手)。

有人能帮我理解一下为什么这会阻塞线程而不应该阻止它吗?并建议如何修复它?

  • netty: 4.1.58
  • 弹簧-启动: 2.4.2
  • 春季: 5.3.3
代码语言:javascript
复制
@SpringBootApplication
public class WebClientTestApplication {

    public static void main(String[] args) {
        BlockHound.install();
        SpringApplication.run(WebClientTestApplication.class, args);
    }
    
    static String endpoint  =  "http://postman-echo.com/get?name=value";

    @Bean
    public RouterFunction<ServerResponse> testWebClient(WebClient.Builder webClientBuilder) {
        
        WebClient webClient = webClientBuilder.build();
        
        HandlerFunction<ServerResponse> testHandler = new HandlerFunction<>() { 
            @Override
            public Mono<ServerResponse> handle(ServerRequest request) {

                Mono<String> stringMono = webClient.get().uri(endpoint)
                        .retrieve().bodyToMono(String.class)
                        .flatMap(body -> Mono.just("Modify the response " + body));

                return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                        .body(stringMono, String.class); 
            }
        };
        return RouterFunctions.route(GET("/test-web-client").and(
                accept(MediaType.TEXT_PLAIN)),testHandler::handle);  
    }
}

这就是在上面的代码中使用http://postman-echo.com/get?name=value时所发生的情况。

代码语言:javascript
复制
Caused by: reactor.blockhound.BlockingOperationError: Blocking call! java.io.FileInputStream#readBytes
    at java.base/java.io.FileInputStream.readBytes(FileInputStream.java) ~[na:na]
    at java.base/java.io.FileInputStream.read(FileInputStream.java:279) ~[na:na]
    at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[na:na]
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[na:na]
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[na:na]
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185) ~[na:na]
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:161) ~[na:na]
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326) ~[na:na]
    at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392) ~[na:na]
    at io.netty.resolver.dns.UnixResolverDnsServerAddressStreamProvider.parseEtcResolverSearchDomains(UnixResolverDnsServerAddressStreamProvider.java:373) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
    at io.netty.resolver.dns.UnixResolverDnsServerAddressStreamProvider.parseEtcResolverSearchDomains(UnixResolverDnsServerAddressStreamProvider.java:354) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
    at io.netty.resolver.dns.DnsNameResolver.<clinit>(DnsNameResolver.java:137) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
    at io.netty.resolver.dns.DnsNameResolverBuilder.<init>(DnsNameResolverBuilder.java:49) ~[netty-resolver-dns-4.1.58.Final.jar:4.1.58.Final]
    at reactor.netty.transport.NameResolverProvider.newNameResolverGroup(NameResolverProvider.java:405) ~[reactor-netty-core-1.0.3.jar:1.0.3]
    ......

如果您修改端点以使用https:https://postman-echo.com/get?name=value,则会发生这种情况。

代码语言:javascript
复制
Caused by: reactor.blockhound.BlockingOperationError: Blocking call! java.io.FileInputStream#readBytes
    at java.base/java.io.FileInputStream.readBytes(FileInputStream.java) ~[na:na]
    at java.base/java.io.FileInputStream.read(FileInputStream.java:279) ~[na:na]
    at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252) ~[na:na]
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:271) ~[na:na]
    at java.base/sun.security.util.DerValue.init(DerValue.java:388) ~[na:na]
    at java.base/sun.security.util.DerValue.<init>(DerValue.java:331) ~[na:na]
    at java.base/sun.security.util.DerValue.<init>(DerValue.java:344) ~[na:na]
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1993) ~[na:na]
    at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222) ~[na:na]
    at java.base/java.security.KeyStore.load(KeyStore.java:1479) ~[na:na]
    at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.loadKeyStore(TrustStoreManager.java:365) ~[na:na]
    ......
EN

回答 1

Stack Overflow用户

发布于 2021-02-07 21:04:42

据报道,这似乎是一种问题

修正是合并,它将在4.1.59.Final版本中发布,到编写时它还没有发布,但它是一个计划中的里程碑

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66091050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档