在 Spring Webflux 中阻止读取 5000 毫秒的超时

2022-09-01 13:32:52

我为Handler(Spring Webflux)写了一个测试

@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();

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


答案 1

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

@Autowired
private WebTestClient webTestClient;

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

答案 2

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

例如:

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

推荐