Ответ Vert.x уже написан - PullRequest
0 голосов
/ 27 января 2020

У меня проблема с vert.x. Когда тайм-аут срабатывает, он генерирует ответ, затем приходит фактический ответ (занимает 10 сек c) и пытается выполнить ответ, поэтому я получаю:

java .lang. IllegalStateException: Ответ уже написан

Я новичок в Vert.x и не уверен в желаемом поведении. Как мне это сделать? Поскольку код асинхронный, я не нахожу способ проверить, был ли ответ уже отправлен.

Есть ли способ сделать это по-почтовому?

У меня есть этот код:

private void setExternalCallAccessibleWithCircuitBreaker() {

        CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
                new CircuitBreakerOptions().setMaxFailures(3) // number of failure before opening the circuit
                        .setTimeout(1000) // consider a failure if the operation does not succeed in time
                        .setFallbackOnFailure(true) // do we call the fallback on failure
                        .setResetTimeout(10000) // time spent in open state before attempting to re-try
        );

        vertx.createHttpServer().requestHandler(req -> {

            // some code executing with the breaker
            // the code reports failures or success on the given future.
            // if this future is marked as failed, the breaker increased the
            // number of failures
            breaker.executeWithFallback(future -> {

                // call the external service
                WebClient client = WebClient.create(vertx);

                client.get(8080, "localhost", "/wait10Seconds").send(ar -> {
                    if (ar.succeeded()) {

                        HttpResponse<Buffer> response = ar.result();

                        System.out.println("Received response with status code" + response.statusCode());
                        System.out.println("response.bodyAsString()" + response.bodyAsString());

                        req.response().end(response.body());
                        future.complete();

                    } else {
                        System.out.println("Something went wrong " + ar.cause().getMessage());
                        req.response().end("error");
                        future.fail("not possible to complete the request");
                    }
                });

            }, (Throwable exception) -> {

                req.response().end("error " + exception.getMessage());
                return exception;

            }).setHandler(ar -> {
                // Get the operation result.
                System.out.println("ar: " + ar);
            });

        }).listen(8088);
        System.out.println("Running");
    }

1 Ответ

3 голосов
/ 27 января 2020

Я нашел этот метод, по-видимому, он работает:

if (!req.response().ended()) {
    req.response().end(response.body());
}
...