Итак, вот ситуация: я реализую кэширование нашего веб-приложения с помощью 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 в переменную или, может быть, каким-то образом установить его в переменной синхронно ? Я также искал способы как-то остановить весь поток текущего запроса, но пока не смог найти удовлетворительного, неагрессивного решения, но я действительно открыт для этой опции.