我正在开发一个web流量应用程序,它公开一个WebClient调用的http端点,然后修改WebClient调用的响应体,然后返回到客户端。当我启用封锁线时,我发现它阻塞了,我正在试图找出原因。
下面是我可以想出的用于重新创建行为的最简单的代码版本。我还在这里放置了一个工作项目:https://github.com/aztosca/web-client-test。注入的WebClient.Builder是他们推荐使用的Spring的预配置实例。
我认为阻塞狗抱怨是因为事件循环线程被阻塞了。我认为使用WebClient可以防止这种情况发生,并确保在适当的线程上发生任何阻塞,但在这里发生了一些我还不明白的事情(我是网络流量新手)。
有人能帮我理解一下为什么这会阻塞线程而不应该阻止它吗?并建议如何修复它?
@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时所发生的情况。
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,则会发生这种情况。
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]
......https://stackoverflow.com/questions/66091050
复制相似问题