gpt4 book ai didi

redis - [vertx.redis.client]没有处理程序等待消息

转载 作者:行者123 更新时间:2023-12-02 07:09:54 25 4
gpt4 key购买 nike

版本

vert.x核心:3.5.0

vert.x redis 客户端:3.5.0

上下文

2018-06-02 17:40:55.981 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息:14751915

2018-06-02 17:41:10.937 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息: false

2018-06-02 17:41:10.947 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息:false

2018-06-02 17:41:20.937 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息:true

2018-06-02 17:41:30.937 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息:true

2018-06-02 17:41:35.927 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息: false

2018-06-02 17:41:40.937 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息:true

2018-06-02 17:41:50.948 错误 4933 --- [ntloop-thread-2] io.vertx.redis.impl.RedisConnection:没有处理程序等待消息:true

查看io.vertx.redis.impl.RedisConnectioni的代码后找到原因:

  1. 服务器启动后,创建redis连接,即可运行。

  2. 经过很长时间(例如几天)后,连接状态为“DISCONNECTED”。 Vert.x redis客户端向redis服务器发送命令时重新连接redis服务器:

      void send(final Command command) {    // start the handshake if not connected    if (state.get() == State.DISCONNECTED) {      connect();    }
  • connect()调用clearQueue()

  • clearQueue():WAITING命令队列将为空。

  • 当从带有新连接的 Redis 服务器接收数据时调用handleReply()。

  • 注意:此处显示错误日志(从第三行到底部)。

          private void handleReply(Reply reply) {        final Command cmd = waiting.poll();        if (cmd != null) {          switch (reply.type()) {            case '-': // Error              cmd.handle(Future.failedFuture(reply.asType(String.class)));              return;            case '+':   // Status              switch (cmd.responseTransform()) {                case ARRAY:                  cmd.handle(Future.succeededFuture(new JsonArray().add(reply.asType(String.class))));                  break;                default:                  cmd.handle(Future.succeededFuture(reply.asType(cmd.returnType())));                  break;              }              return;            case '$':  // Bulk              switch (cmd.responseTransform()) {                case ARRAY:                  cmd.handle(Future.succeededFuture(new JsonArray().add(reply.asType(String.class, cmd.encoding()))));                  break;                case INFO:                  String info = reply.asType(String.class, cmd.encoding());                  if (info == null) {                    cmd.handle(Future.succeededFuture(null));                  } else {                    String lines[] = info.split("\\r?\\n");                    JsonObject value = new JsonObject();                    JsonObject section = null;                    for (String line : lines) {                      if (line.length() == 0) {                        // end of section                        section = null;                        continue;                      }                      if (line.charAt(0) == '#') {                        // begin section                        section = new JsonObject();                        // create a sub key with the section name                        value.put(line.substring(2).toLowerCase(), section);                      } else {                        // entry in section                        int split = line.indexOf(':');                        if (section == null) {                          value.put(line.substring(0, split), line.substring(split + 1));                        } else {                          section.put(line.substring(0, split), line.substring(split + 1));                        }                      }                    }                    cmd.handle(Future.succeededFuture(value));                  }                  break;                default:                  cmd.handle(Future.succeededFuture(reply.asType(cmd.returnType(), cmd.encoding())));                  break;              }              return;            case '*': // Multi              switch (cmd.responseTransform()) {                case HASH:                  cmd.handle(Future.succeededFuture(reply.asType(JsonObject.class, cmd.encoding())));                  break;                default:                  cmd.handle(Future.succeededFuture(reply.asType(JsonArray.class, cmd.encoding())));                  break;              }              return;            case ':':   // Integer              switch (cmd.responseTransform()) {                case ARRAY:                  cmd.handle(Future.succeededFuture(new JsonArray().add(reply.asType(Long.class))));                  break;                default:                  cmd.handle(Future.succeededFuture(reply.asType(cmd.returnType())));                  break;              }              return;            default:              cmd.handle(Future.failedFuture("Unknown message type"));          }        } else {          // **An error log appears here**          log.error("No handler waiting for message: " + reply.asType(String.class));        }      }

    问题:

    这是不是一个错误?如果不是bug,重新连接redis服务器时,post命令将被丢弃。

    处理这种情况有什么好方法吗?

    最佳答案

    问题已解决。出现上述问题的原因是连接已经被复用,没有关闭。解决办法是:`

    RedisClient redisClient = RedisClient.create(this.vertx, redisOptions);
    //do some thing;
    redisClient.close(h-{})...

    `每个 session 。

    关于redis - [vertx.redis.client]没有处理程序等待消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50697287/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com