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



我为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();

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

我在运行集成测试时看到了类似的问题和异常,其中一些聚合了来自具有数据库访问权限和其他内容的多个其他服务的响应。因此,我们在运行集成测试时间歇性地看到此问题。我们正在使用 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();
}

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

例如:

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

使用WebTestClient您可以使用@AutoConfigureWebTestClient(timeout = "36000")timeout值是您选择的值。特别是,请考虑第三方服务的响应时间。

在 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() {
        ...
    }
}

检查您的 pom 文件,如果存在 BlockHound 依赖项,请将其删除。

<dependency>
  <groupId>io.projectreactor.tools</groupId>
  <artifactId>blockhound</artifactId>
  <version>$LATEST_RELEASE</version>
</dependency>

最新更新