我正在使用 java.net.http 对服务器进行一些 http 调用。但是,有时我会从这里得到“太多并发流”异常:https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.net.http/share/classes/jdk/internal /net/http/Http2Connection.java#L440.
看来我的客户端超出了服务器设置的
MAX_CONCURRENT_STREAMS
值。从其他来源来看,听起来我需要设置一个信号量以确保我不会超过该值。
问题是我不知道服务器的
MAX_CONCURRENT_STREAMS
值是多少。它似乎无法通过 java.net.http API 访问。
有人知道我如何找出服务器正在设置的
MAX_CONCURRENT_STREAMS
吗?
不幸的是
java.net.http.HttpClient
没有公开服务器发送的 MAX_CONCURRENT_STREAMS
的值。
您可以尝试猜测,然后使用
Semaphore
来避免超过它,但作为 java.net.http.HttpClient
的用户,您不应该做很多工作。
[免责声明:我是 Jetty 维护者。]
您可以切换并使用 Jetty 的
HttpClient
,它不会遇到此问题,因为它会仔细处理 MAX_CONCURRENT_STREAMS
值,允许每个连接有多个并发请求,如果超过该值,则会为该连接打开一个新连接并发请求过多。
Jetty 的
HttpClient
还提供了比 JDK 的 HttpClient
更多的功能和配置选项,因此该开关可能会在其他方面为您提供帮助。
您可以在此处找到有关 Jetty
HttpClient
的文档:
https://eclipse.dev/jetty/documentation/jetty-12/programming-guide/index.html#pg-client-http