【问题标题】:webclient blocking main thread netty, why?webclient阻塞主线程netty,为什么?
【发布时间】:2021-11-12 05:06:54
【问题描述】:

我不明白为什么 webclient 会阻塞 netty 主线程 我在这里使用 gradle 是它的依赖项:

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR11"
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    ...
}

此 gradle 脚本用于两个应用程序。 在第一个应用程序中,我执行:

    @GetMapping
    open fun otherApp(): Mono<String> {
        return WebClient.create("http://localhost:8081")
                .get()
                .uri("/test")
                .retrieve()
                .bodyToMono(String::class.java)
//              I tried to use an additional scheduler but the main stream is blocked with it too
//              .publishOn(Schedulers.boundedElastic())
    }

第二个应用程序模拟长响应处理:

@GetMapping("/test")
    open fun test(): Mono<String> {
        Thread.sleep(15000L)
        return Mono.just("Hello");
    }

并且我希望调用服务不会阻塞主线程,而是会继续处理传入的连接,但是直到我从第一个调用得到响应(睡眠会起作用),我的下一个连接都处于等待状态。

结果: 第一个应用程序像 tomcat 一样使用单线程

我的问题: 我怎么了?

【问题讨论】:

  • 你怎么知道第一个应用程序被阻止了?是否再次调用应用程序 2?
  • 我在浏览器中直接调用第一个应用,挂在8080端口,请求挂了,没关系。在 15 秒内,当第二个应用程序模拟第一个请求的处理时,我在另一个浏览器窗口中再次调用第一个应用程序,并且对第一个应用程序的第二个请求没有进入控制器

标签: spring kotlin netty webclient blocking


【解决方案1】:

客户端应用程序不会阻塞,它能够处理新请求。您可以通过添加日志来确认:

@GetMapping("/test")
public Mono<String> test() {
    return Mono.just("incoming request")
        .doOnNext(e -> logger.info("Process: {}", e))
        .flatMap(e -> webclient.test());
}

服务器应用程序被阻塞,因为Thread.sleep(15000L) 阻塞了主线程(考虑改用.delayElement(Duration.ofSeconds(15))

如果问题发生在来自 Web 浏览器的请求中

这是由于浏览器缓存。您应该禁用缓存或强制硬刷新(CTRL + F5)。

我测试了硬刷新,它似乎工作正常。

【讨论】:

  • mmh 如果我正确理解了 OP,这些是 2 个独立的应用程序,因此 Thread.sleep 无法阻止第一个应用程序(请参阅帖子下方的评论)
  • 没错,服务器应用程序(第二个)阻塞了。
  • 对不起,显然你误解了我的意思。我通过浏览器访问的客户端应用程序被阻止(但它不应该),第二个应用程序(服务器)我不介意它被阻止,问题是为什么客户端应用程序的 webclient 会阻止线程
  • 被浏览器屏蔽了。
  • 尝试从您的浏览器同时发出 2 个请求。您将在约 15 秒内得到两个响应。这是因为客户端应用程序没有阻塞,它立即将两个请求转发到服务器应用程序。
猜你喜欢
  • 2020-01-02
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多