0

所以情况是这样的:我正在使用 vertx-redis 实现我们的 webapp 的缓存(我们以前使用lettuce)。非常简单的机制,我们在端点上使用了一个注释,它负责调用 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 是一个语义 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 的内容返回给变量,或者以某种方式将其同步设置为变量?我也一直在寻找以某种方式阻止当前请求的整个流程的方法,但到目前为止找不到任何令人满意的、非激进的解决方案,但我也对这个选项持开放态度。

4

0 回答 0