Как остановить Vertx темы? - PullRequest
0 голосов
/ 07 апреля 2020

Итак, вот ситуация: я реализую кэширование нашего веб-приложения с помощью vertx-redis (ранее мы использовали салат ). Довольно простой механизм, мы используем аннотацию на конечных точках, которая отвечает за вызов redis-клиента (независимо от того, какую реализацию мы используем), и, если есть кэшированная информация для данного ключа, она должна использоваться как тело ответа, а запрос должен закончить без обработки.

Но в реализации vertx-redis есть действительно раздражающее поведение, при котором завершение запроса не останавливает обработку. Я делаю запрос, получаю быстрый ответ, поскольку там была кэшированная информация, но я все еще вижу в журналах, что приложение продолжает обработку, как будто запрос все еще открыт. Я полагаю, что это потому, что я заканчиваю ответ внутри обработчика для вызова клиента Redis, например:

client.get("key", onResponse -> {
    if (onResponse.succeeded() && onResponse.result() != null) {
        //ending request from here
    }
});

Я понимаю, что мог бы воспроизвести поведение, как было раньше, если бы я мог что-то сделать например:

String cachedInfo = client.get("key").map(onResponse -> onResponse.result());
// endResponse

Но, как мы знаем, vertx-redis - это семантический c API, и каждый метод возвращает один и тот же экземпляр RedisClient. Я также думал о том, чтобы сделать что-то вроде этого:

private String cachedInfo; 

...

client.get("key", onResult -> {
    if (onResponse.succeeded()) {
        this.cachedInfo = onResponse.result();
    }
});

if (cachedInfo != null) { // The value could be unset since the lambda is running in other thread 
    //end request
}

На самом деле не знаю, что делать, есть ли способ вернуть содержимое AsyncResult в переменную или, может быть, каким-то образом установить его в переменной синхронно ? Я также искал способы как-то остановить весь поток текущего запроса, но пока не смог найти удовлетворительного, неагрессивного решения, но я действительно открыт для этой опции.

...