Vertx - 等待数据在 redis 中可用

Vertx - wait till data available in redis

我是 Vertx 的新手,正在探索使用事件总线的请求-回复。

我想实现以下流程

  1. 用户请求数据
  2. 控制器在事件总线上向 redis 处理器 verticle 发送消息
  3. redis-processor 将等待 n 秒直到值在 redis 中可用(将有一个后台进程将继续刷新缓存,因此等待)
  4. redis-processor 会将回复发送回 controller
  5. 控制器响应用户

简而言之,我想做这样的事情:

现在我想在 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
      }

    });
  });