我正在使用以下代码运行Quarkus 2.7.0.CR1:
return httpRequest.sendBuffer(createBuffer())
.onSubscription()
.invoke(() -> metricsRecorder.start(METRICS_NAME))
.onFailure()
.recoverWithUni(failure -> fetchWithOtherCredentials())
...
如果 URL 中的端口根本没有响应,则onFailure()
触发。但是当从 WireMock 返回 HTTP 500 时,此代码只会抛出状态为 500WebApplicationException
而不触发onFailure()
。这是触发onFailure()
的异常:
io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:8085
AnnotatedConnectException
似乎被检查异常,但在此示例中使用了IllegalArgumentException
,这RuntimeException
像WebApplicationException
。
我认为onFailure()
应该在任何异常时触发。知道发生了什么吗?我已经用@QuarkusTest
进行了测试,也通过在本地运行Quarkus进行了测试mvn compile quarkus:dev
。
HttpRequest.sendBuffer()
返回一个Uni<HttpResponse<T>>
。当服务器以状态500
响应时,Web客户端不会发出故障,它会发出状态代码为500
的HttpResponse
。
您应该检查响应,如下所示:
Uni<HttpResponse> uni = httpRequest
.sendBuffer(createBuffer())
.onItem().transformToUni(res -> {
if (res.statusCode() == 200 && res.getHeader("content-type").equals("application/json")) {
// Do something with JSON body and return new Uni
} else {
// Generate failure as Uni
}
});
另一种选择是使用响应谓词:
Uni<HttpResponse> uni = httpRequest
.expect(ResponsePredicate.SC_SUCCESS)
.expect(ResponsePredicate.JSON)
.sendBuffer(createBuffer());
在这种情况下,仅当响应具有状态代码200
和 JSON 正文时,返回的Uni<HttpResponse>
才会成功,否则将失败。