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