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

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

李兴安
2023-03-14

版本

维特。x核心:3.5.0

vert. x redis客户端:3.5.0

上下文

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

2018-06-02 17:41:10.937错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl。重新连接:没有处理程序等待消息:false

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

2018-06-02 17:41:20.937错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl。重新连接:没有处理程序等待消息:true

2018-06-02 17:41:30.937错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl。重新连接:没有处理程序等待消息:true

2018-06-02 17:41:35.927错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl。重新连接:没有处理程序等待消息:false

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

2018-06-02 17:41:50.948错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl。重新连接:没有处理程序等待消息:true

io的后视图代码。维特斯。雷迪斯。impl。我们无法找到原因:

>

  • 当服务器启动时,创建redis连接,就可以运行了。

    长时间(如几天)后,连接状态断开。维特。x redis客户端在向redis服务器发送命令时重新连接redis服务器:

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

    connect()调用clearQueue()

    clearQueue():等待命令quene将为空。

    当收到来自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));
            }
          }
    
    

    问题:

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

    处理这种情况的好方法是什么?

  • 共有1个答案

    闻人冷勋
    2023-03-14

    问题已解决,出现上述问题的原因是连接已被重用,尚未关闭,解决方法是:'

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

    `每节课。

     类似资料:
    • 我有以下兔子听者: 我需要将listener配置为在它处理一条消息后等待15分钟,然后再接收下一条消息。不需要在此方法中等待。我所需要的只是在处理完一条后不接收任何消息。可以通过来完成,但我不确定这是否是实现这一点的最佳方法。对于这种情况有没有rabbitmq的配置?

    • 我正在使用hiredis C库连接到redis服务器。我不知道在订阅新消息后如何等待新消息。 我的代码如下所示: 现在如何告诉雇佣者在频道上等待消息?

    • 我的代码仍在工作,我可以发送消息并等待消息发送完毕。发送消息的持续时间大约为10秒,这对我不好,因为我的程序需要1秒的间隔才能发送下一条消息。看看以澄清问题。 msg4- msg4、msg3和msg2仍在等待,直到msg1发送/失败。 这是代码sendMessage.java 在我看来。java类 第一条消息已成功发送,但第二条消息等未发送。如何使这些等待直到发送第一条消息?

    • 我正在构建一个应用程序,其中微服务通过RabbitMQ(请求-响应模式)进行通信 一切正常,但我仍然有一个错误“远程服务中没有定义匹配的消息处理程序。”- 当我向客户端应用程序发送帖子时,它只需通过客户端(ClientProxy)发送包含数据的消息,消费者应用程序就会响应。此功能实际上可以工作,但始终只能第二次使用。我知道这听起来很奇怪,但在我的第一个POST请求中,总是有来自客户的错误,我的每一

    • 问题内容: 我正在使用hiredis C库连接到redis服务器。我无法弄清楚订阅新消息后如何等待新消息。 我的代码如下所示: 现在如何告诉hiredis在频道上等待消息? 问题答案: 您无需告诉hiredis您需要在通道上等待:事件循环将仅在先前已注册的Redis连接上等待。 这是一个完整的示例: 您可以通过使用以下命令发布内容来对其进行测试: event_base_dispatch函数是实际启

    • 我试图通过使用Jms Qpid客户端的Spring Boot应用程序使用Apache Qpid。我可以对其进行配置,但当我尝试从队列接收消息时,记录器正在打印: 这是我的代码: JMS配置。Java语言 应用属性 schduledTask.java它只是按间隔运行发送和接收消息。