我是Vertx的新手,正在探索使用事件总线的请求回复。
我想实现下面的流程
简而言之,我想做这样的事情:
现在我想在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秒?
请帮忙。
正如@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
}
});
});
这其实很简单,你需要一个计时器。有关详细信息,请参阅文档,但您或多或少需要这样的东西:
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. 问题是,未定义,因为需要一些时间才能返回响应数据。如何等待响应数据然后返回?