当前位置: 首页 > 知识库问答 >
问题:

Vertx-等待redis中的数据可用

胥宏义
2023-03-14

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

我想实现下面的流程

  1. 用户对数据的请求
  2. 控制器通过事件总线向redis处理器垂直体发送消息
  3. redis处理器将等待n秒,直到redis中的值可用(将有一个后台进程持续刷新缓存,因此等待)
  4. redis处理器将向控制器发送回复
  5. 控制器响应用户

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

现在我想在Vertx中实现这一点,因为Vertx可以异步运行。使用事件总线,我可以隔离控制器和处理器。因此,控制器可以接受多个用户的请求,并在html" target="_blank">负载下保持响应。(我希望我是对的!)

我在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秒?

请帮忙。

共有2个答案

祝俊雄
2023-03-14

正如@mohamnag所说,你可以使用Vertx计时器

下面是另一个关于如何使用计时器的示例。

请注意,计时器值的单位为ms

作为对的改进,我建议在尝试从redisAPI获取值之前检查回调是否成功。这是使用succeed()方法完成的。在异步环境中,由于几个问题(网络错误等),获取该结果可能会失败

 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
      }

    });
  });

陆啸
2023-03-14

这其实很简单,你需要一个计时器。有关详细信息,请参阅文档,但您或多或少需要这样的东西:

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存储在某个地方,以便您可以取消它们,或者至少当顶点延迟关闭请求时,您知道某些内容正在运行。但这都取决于你的需求。

 类似资料:
  • 由于我在堆栈中使用Vertx3.1,我想使用这些工具带来的未来特性,但在阅读后,API似乎对我来说相当有限。我甚至找不到方法让未来等待一个可观察的。这里是我的代码 在我第一次观察到的onComplete中,我正在检查结果,在finish之后是当我完成以后解除阻塞的操作。但是我正在寻找未来。结果不会被阻止,直到未来。完成像我期望的那样被调用。而是返回null。 问候。

  • 我有一个Go应用程序,使用Radix Redis客户端进行Go。它的任务是作为后台进程运行,并等待Redis列表添加项目以进行处理。 背景(请随意跳过):我有一个节点。需要从外部API请求数据的js web应用程序,已知至少需要一整秒钟或更长时间才能响应。数据不是立即需要的,所以我让Node应用程序向Redis列表中添加一个项目,然后继续处理重要的内容。同时,我有一个Go应用程序,应该在后台运行,

  • 问题内容: 我有一个Python程序,该程序通过 PySerial 模块从串行端口读取数据。我需要牢记的两个条件是:我不知道会有多少数据到达,并且我也不知道何时需要数据。 基于此,我提出了以下代码段: 因此,此代码将永远循环以从串行端口获取数据。我们最多可以存储500个字符,然后通过设置一个标志来警告主循环。如果没有数据,我们将回到睡眠状态并等待。 该代码正在运行,但是我不喜欢5s超时。我需要它是

  • 任务或任务 我们也可以定义自己的可实现对象。对象应具有以下资格。 < li >它有一个GetAwaiter()方法(实例方法或扩展方法); < li >其GetAwaiter()方法返回一个Awaiter。在下列情况下,对象是一个标识符: < ul > < li >它实现INotifyCompletion或ICriticalNotifyCompletion接口; < li >它有一个IsCompl

  • 我想知道在protectedData不可用的情况下推迟应用程序启动是否可以... 我的意思是

  • 我有一个Vue组件,我试图从使用axios的API获取一些数据。 函数位于Vue组件文件之外的另一个JS文件中,该文件使用axios.get. 问题是,未定义,因为需要一些时间才能返回响应数据。如何等待响应数据然后返回?