【问题标题】:Timeout on blocking read for 5000 MILLISECONDS in Spring WEBLUXSpring WEBLUX 中阻塞读取 5000 MILLISECONDS 时超时
【发布时间】:2023-03-15 17:26:01
【问题描述】:

我为Handler(spring weblux)写了一个测试

测试:

@Test
    public void checkServicesHandlerTest(){
      Request request = new Request();
        request.setMsisdn("ffdfdfd");

        this.testClient.post().uri("/check")
                .body(Mono.just(request), Request.class).exchange().expectStatus().isOk();       
    }

但结果我有一个错误。

Timeout on blocking read for 5000 MILLISECONDS

处理程序很简单

 public Mono<ServerResponse> check(ServerRequest request){

       Request request = request.bodyToMono(Request.class).block();

问题出在哪里?但是如果我直接向服务器发送请求,一切都可以。

【问题讨论】:

  • 这是您的整个处理程序实现吗?强烈建议不要在处理程序中使用 block(),这可能是根本问题。
  • 谢谢。没有阻塞地写,它工作正常。你也能推荐一个关于reator3或weblux的好课程吗?
  • 那你能回答你自己的问题吗?这可能会帮助其他 SO 用户。
  • @BrianClozel 我看到了同样的问题。我有一个集成测试(使用 Junit5,它是 Spring boot 2.0.0.RC1),它让所有用户都可以调用内部从表中获取它的 Web 服务,并且该表最多可以有 50-60 个用户。我看到当用户是 15-20 人时,测试过去常常通过。现在失败了。请指教。

标签: java spring-webflux


【解决方案1】:

如果是 Kotlin 测试,它可能是以下示例:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class RouterTests {
    lateinit var client: WebTestClient

    private val dealService: DealService = QshDealService()
    private val dealStream: StreamHandler<MarketData> = DealStream(dealService)
    private lateinit var fileService: FileService

    @BeforeAll
    fun init() {
        val streamHandlers: Map<String, StreamHandler<MarketData>> = mapOf("dealStream" to dealStream)
        fileService = CommonFilesService(streamHandlers)
        val filesHandler = QshFilesHandler(fileService)
        this.client = WebTestClient
            .bindToRouterFunction(QshRouter(filesHandler).route())
            .configureClient()
            .responseTimeout(Duration.ofMillis(30000))
            .build()
    }

    @Test
    fun whenRequestToRoute_thenStatusShouldBeOk() {
        ...
    }

}

【讨论】:

    【解决方案2】:

    您可以使用注解@AutoConfigureWebTestClient(timeout = "36000") 覆盖超时。

    例如:

    @AutoConfigureWebTestClient(timeout = "36000")
    @SpringBootTest
    class MyTestClass {
    }
    

    【讨论】:

      【解决方案3】:

      我在运行集成测试时看到了类似的问题和异常,其中一些会聚合来自具有数据库访问权限和内容的多个其他服务的响应。所以我们在运行集成测试时会间歇性地看到这个问题。我们使用带有 Gradle 的 Spring Boot 2.0.0.RC1 和 Junit 5。我这样做是为了解决这个问题。关键是在最坏的情况下以 30 秒的响应超时来改变 Web 客户端。

          @Autowired
          private WebTestClient webTestClient;
      
              @BeforeEach
              public void setUp() {
               webTestClient = webTestClient
                                  .mutate()
                                  .responseTimeout(Duration.ofMillis(30000))
                                  .build();
              }
      

      【讨论】:

      • 无论我设置的超时时间如何,我总是会超时。但是如果我启动应用程序并直接测试端点,我的 rest api(类似于上面的那个)可以正常工作
      • 嗨,我也面临同样的问题。即使我设置了超时,仍然会抛出错误。任何其他想法如何解决它?
      • 我不得不说:#me too
      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2016-11-14
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多