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

MongoDB:ReadPreferenceServerSelector未选择服务器

彭涵衍
2023-03-14

最近我使用的是mongodb java异步驱动程序,它是最新发布的。我正在写一些简单的测试代码,它们是:

    MongoClient mongoClient = MongoClients.create();
    System.out.println("database has been connected!");

    SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
        @Override
        public void onResult(final Void result, final Throwable t) {
            System.out.println("Operation Finished!");
        }
    };

    mongoClient.listDatabaseNames().forEach(new Block<String>() {
        @Override
        public void apply(final String s) {
            System.out.println(s);
        }
    }, callbackWhenFinished);

所以您可以看到没有调用回调函数。有人知道为什么吗?

共有1个答案

米夕
2023-03-14

简单的回答是您的回调最终将被调用。

为了获得更长的答案,让我们通过您的代码:

    MongoClient mongoClient = MongoClients.create();
    System.out.println("database has been connected!");

MongoClient不会阻止等待连接到后台的MongoDB(内部连接池正在尝试连接)。从您的日志中,我可以看到您的默认ServerSelectionTimeout为30000ms。

  System.out.println("======= Start =======");

  MongoClient mongoClient = MongoClients.create();

  final CountDownLatch latch = new CountDownLatch(1);

  SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
      @Override
      public void onResult(final Void result, final Throwable t) {
          System.out.println("Operation Finished!");
          if (t != null) {
              System.out.println("listDatabaseNames() errored: " + t.getMessage());
          }
          latch.countDown();
      }
  };

  mongoClient.listDatabaseNames().forEach(new Block<String>() {
      @Override
      public void apply(final String s) {
          System.out.println(s);
      }
  }, callbackWhenFinished);

  latch.await();

  // close resources
  mongoClient.close();
  System.out.println("======= Finish =======");

>

  • 没有MongoDB可用。它最终将调用回调并打印出有错误。它将等待直到ServerSelectionTimeout超时。

    有一个MongoDB可用。它将最终连接,对于每个数据库,它将应用block并打印出数据库名称,然后最后调用它完成的回调信令。

  •  类似资料:
    • 我正在尝试使用本地文件系统设置spring config cloud。 下面是我在云服务器上的配置。 客户端应用程序上的bootstrap.properties如下所示 步骤2:启动客户端应用程序,客户端应用程序能够从云配置服务器读取属性文件。 步骤3:通过更新hello-world.yaml上的来更改配置。 此时,如果我检查,它仍然显示旧值。 只有当我重新启动云配置服务器时,新的更改才会反映出来

    • 我的Kubernetes集群运行在谷歌云下。我有部署运行端口443和LoadBalancer公开它到互联网。 我是这样创建的: 运行此命令后,loadbalancer将指向部署。现在,我创建了,并希望更改loadbalancer以指向新的部署()。 注意:删除和重新创建部署是释放外部IP地址,我想避免它。 如何在不丢失外部IP的情况下修补现有服务以指向另一个部署?

    • 启动开发环境服务可以设置不同的 hostname,你可以在启动命令后面加上--hostname 主机名 或 -H 主机名。它将会启动一个 TCP 服务器来监听连接所提供的主机。

    • 问题内容: 是否可以使用MySQL客户端编写跨服务器选择查询。基本上,设置如下。 服务器IP数据库 --------- -------- 1.2.3.4测试 abcd测试 我想编写一个查询,该查询将从1.2.3.4的“测试数据库”中的表中选择行,并将结果插入表中的abcd的“测试数据库”中。 我的服务器相距千里,所以我将打开SSH隧道进行连接他们俩。 有指针吗? 问题答案: 可能是已经提到的解决方

    • 问题内容: 我在没有选择器的情况下在Kubernetes的服务中苦苦挣扎。群集通过kops安装在AWS上。我有一个带有3个Nginx Pod的部署,暴露了端口80: 创建部署后,我记下了IP地址: 并创建了一个服务于IP地址的服务: 服务已成功创建: 不幸的是,我尝试通过服务从相同名称空间的另一个Pod连接到Nginx失败: 我可以直接成功地连接到Nginx Pod: 我注意到我的服务没有任何端点

    • 我已经为我的应用程序实现了shedlock,对于我们拥有的两台服务器来说,它运行良好,没有任何问题。 我们现在在另一个域上添加了两个新服务器,shedlock也会选择它们。(好吧,这就是它的本意) 我有一份工作,创建pdf文件并将其放在文件夹中。添加的新服务器无权访问这些文件夹。因此,当这两个新服务器选择作业时,我的作业将失败。 有没有可能告诉夏洛克从我的两台服务器中选择任何一台,或者不选择另外两