Java Vertx-等待redis中可用的数据

Java Vertx-等待redis中可用的数据,java,asynchronous,redis,vert.x,Java,Asynchronous,Redis,Vert.x,我是Vertx新手,正在探索使用事件总线的请求-应答 我想实现下面的流程 用户对数据源的请求 控制器通过事件总线向redis处理器垂直体发送消息 redis处理器将等待n秒,直到redis中的值可用为止(将有一个后台进程持续刷新缓存,因此等待) redis处理器将向控制器发送回复 控制器响应用户请求 简言之,我想做这样的事情: vertx.setTimer(1000, id -> { this.redisAPI.get(txnId, result -> {

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

我想实现下面的流程

  • 用户对数据源的请求
  • 控制器通过事件总线向redis处理器垂直体发送消息
  • redis处理器将等待n秒,直到redis中的值可用为止(将有一个后台进程持续刷新缓存,因此等待)
  • redis处理器将向控制器发送回复
  • 控制器响应用户请求
  • 简言之,我想做这样的事情:

    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
        });
    });
    

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

    我在JavaVertx中以非常粗糙的方式实现了这一点。卡在下面的部分

    //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
        });
    }); 
    
    //从控制器接收请求
    vertx.eventBus().consumer(请求处理器,evtHandler->{
    字符串txnId=evtHandler.body().toString();
    info(“收到的消息:{}”,txnId);
    
    这个.redisAPI.get(txnId,result->{/实际上非常简单,您需要一个计时器。有关详细信息,请参阅,但您或多或少需要类似以下内容:

    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所说,您可以使用

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

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

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


    是的,谢谢你的回答。我实际上是通过使用
    setPeriodic
    实现的。在这方面,我轮询的持续时间为几毫秒。一旦我得到数据,我就会取消计时器并返回响应。我还有一个问题,那就是如何保持轮询的上限。过了n秒后如何退出?periodic也可以。关于取消,yo你可以想出任何自行设计的机制。Vertx只提供基本的工具。例如,你可以在你的周期后设置一个计时器(有它的ID),当它触发时取消它(或者如果它不能被取消,就忽略它意味着已经完成)。