[vertx.redis.client] Нет обработчика, ожидающего сообщения - PullRequest
0 голосов
/ 05 июня 2018

Версия

vert.x core: 3.5.0

vert.x Redis клиент: 3.5.0

Context

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. Через длительное время (например, дни) состояние соединения ОТКЛЮЧЕНО.Redis клиент Vert.x переподключает сервер redis при отправке команды на сервер redis:


      void send(final Command command) {

    // start the handshake if not connected
    if (state.get() == State.DISCONNECTED) {
      connect();
    }

connect () вызов clearQueue ()

clearQueue (): ожидание команды ожидания будет пустым.

Call handleReply() при получении с сервера redis с новым подключением.

примечание: здесь отображается журнал ошибок (третья строка внизу).


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

вопрос:

Это ошибка или нет?Если это не ошибка, команды post будут отброшены при повторном подключении сервера redis.

Какой хороший способ справиться с этой ситуацией?

1 Ответ

0 голосов
/ 13 июня 2018

Проблема была решена.Причина вышеуказанной проблемы заключается в том, что соединение использовалось повторно и не было закрыто.Решение: `

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

` для каждого сеанса.

...