所以情况是这样的:我正在使用vertxredis(我们以前使用的是莴苣)实现webapp的缓存。非常简单的机制,我们在端点上使用一个anotation,它负责调用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的内容返回到一个变量,或者以某种方式将其同步设置为一个变量?我也一直在寻找某种方法来阻止当前请求的整个流程,但到目前为止还没有找到任何令人满意的、非攻击性的解决方案,但我也非常愿意接受这个选项。
暂无答案!
目前还没有任何答案,快来回答吧!