Vertx - 等待数据在 redis 中可用
Vertx - wait till data available in redis
我是 Vertx 的新手,正在探索使用事件总线的请求-回复。
我想实现以下流程
- 用户请求数据
- 控制器在事件总线上向 redis 处理器 verticle 发送消息
- redis-processor 将等待 n 秒直到值在 redis 中可用(将有一个后台进程将继续刷新缓存,因此等待)
- redis-processor 会将回复发送回 controller
- 控制器响应用户
简而言之,我想做这样的事情:
现在我想在 Vertx 中实现它,因为 vertx 可以 运行 异步。使用事件总线,我可以将控制器与处理器隔离开来。因此控制器可以接受多个用户请求并在负载下保持响应。
(我希望我是对的!)
我在 java-vertx 中以非常粗略的方式实现了这个。卡在下面部分。
//receive request from controller
vertx.eventBus().consumer(REQUEST_PROCESSOR, evtHandler -> {
String txnId = evtHandler.body().toString();
LOGGER.info("Received message:: {}", txnId);
this.redisAPI.get(txnId, result -> { // <=====
String value = result.result().toString();
LOGGER.info("Value in redis : {}", value);
evtHandler.reply(value); // reply to controller
});
});
请看箭头所指的线。如何在不阻塞事件循环的情况下等待 x 秒?
请帮忙
其实很简单,你需要一个定时器。请参阅 docs 了解详细信息,但您或多或少需要这样的东西:
vertx.setTimer(1000, id -> {
this.redisAPI.get(txnId, result -> {
String value = result.result().toString();
LOGGER.info("Value in redis : {}", value);
evtHandler.reply(value); // reply to controller
});
});
您可能希望将计时器 ID 存储在某处,以便您可以取消它们,或者至少您知道当关闭请求进入时 运行 有什么东西让您的 Verticle 延迟它。但这完全取决于您的需求。
正如@mohamnag 所说,您可以使用 Vertx timer
here 是另一个关于如何使用定时器的例子。
注意定时器值在ms
.
作为对 的改进,我建议在尝试从 redisAPI 获取值之前检查回调是否成功。这是使用 succeeded() method
完成的。
在异步环境中,由于几个问题(网络错误等),获取该结果可能会失败
vertx.setTimer(n * 1000, id -> {
this.redisAPI.get(txnId, result -> {
if(result.succeeded()){ // the callback succeeded to get a value from redis
String value = result.result().toString();
LOGGER.info("Value in redis : {}", value);
evtHandler.reply(value); // reply to controller
} else {
LOGGER.error("Value could not be gotten from redis : {}", result.cause());
evtHandler.fail(someIntegerCode, result.cause()); // reply with failure related info
}
});
});
我是 Vertx 的新手,正在探索使用事件总线的请求-回复。
我想实现以下流程
- 用户请求数据
- 控制器在事件总线上向 redis 处理器 verticle 发送消息
- redis-processor 将等待 n 秒直到值在 redis 中可用(将有一个后台进程将继续刷新缓存,因此等待)
- redis-processor 会将回复发送回 controller
- 控制器响应用户
简而言之,我想做这样的事情:
现在我想在 Vertx 中实现它,因为 vertx 可以 运行 异步。使用事件总线,我可以将控制器与处理器隔离开来。因此控制器可以接受多个用户请求并在负载下保持响应。 (我希望我是对的!)
我在 java-vertx 中以非常粗略的方式实现了这个。卡在下面部分。
//receive request from controller
vertx.eventBus().consumer(REQUEST_PROCESSOR, evtHandler -> {
String txnId = evtHandler.body().toString();
LOGGER.info("Received message:: {}", txnId);
this.redisAPI.get(txnId, result -> { // <=====
String value = result.result().toString();
LOGGER.info("Value in redis : {}", value);
evtHandler.reply(value); // reply to controller
});
});
请看箭头所指的线。如何在不阻塞事件循环的情况下等待 x 秒?
请帮忙
其实很简单,你需要一个定时器。请参阅 docs 了解详细信息,但您或多或少需要这样的东西:
vertx.setTimer(1000, id -> {
this.redisAPI.get(txnId, result -> {
String value = result.result().toString();
LOGGER.info("Value in redis : {}", value);
evtHandler.reply(value); // reply to controller
});
});
您可能希望将计时器 ID 存储在某处,以便您可以取消它们,或者至少您知道当关闭请求进入时 运行 有什么东西让您的 Verticle 延迟它。但这完全取决于您的需求。
正如@mohamnag 所说,您可以使用 Vertx timer
here 是另一个关于如何使用定时器的例子。
注意定时器值在ms
.
作为对 的改进,我建议在尝试从 redisAPI 获取值之前检查回调是否成功。这是使用 succeeded() method
完成的。
在异步环境中,由于几个问题(网络错误等),获取该结果可能会失败
vertx.setTimer(n * 1000, id -> {
this.redisAPI.get(txnId, result -> {
if(result.succeeded()){ // the callback succeeded to get a value from redis
String value = result.result().toString();
LOGGER.info("Value in redis : {}", value);
evtHandler.reply(value); // reply to controller
} else {
LOGGER.error("Value could not be gotten from redis : {}", result.cause());
evtHandler.fail(someIntegerCode, result.cause()); // reply with failure related info
}
});
});