gpt4 book ai didi

MongoDB:ReadPreferenceServerSelector 未选择服务器

转载 作者:可可西里 更新时间:2023-11-01 09:08:52 24 4
gpt4 key购买 nike

最近正在使用新发布的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);

但是没有调用回调函数,控制台输出为:

April 18, 2015 10:50:27 afternoon com.mongodb.diagnostics.logging.JULLogger log message: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
database has been connected! April 18, 2015 10:50:28 afternoon com.mongodb.diagnostics.logging.JULLogger log message: No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, all=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out

所以你可以看到没有调用回调函数。谁知道为什么?

最佳答案

简短的回答是你的回调最终会被调用。

对于长答案,让我们研究一下您的代码:

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

MongoClient 不会在内部连接池尝试连接的后台阻止等待与 MongoDB 的连接。从您的日志中我可以看到您的默认 serverSelectionTimeout 为 30000 毫秒。

下一步你做一个 println 立即输出“数据库已连接!”无论如何都会打印出来。

最后,您调用了 listDatabaseNames(),但不清楚是否有任何等待回调被调用。如果您添加一个闩锁然后等待响应,那么您将看到回调被调用,例如:

  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 =======");

现在我们使用闩锁 await() 直到回调被调用,现在我们应该看到以下两种情况之一发生:

  1. 没有可用的 MongoDB。它最终会调用回调并打印出有错误。它将等到 serverSelectionTimeout 超时。

  2. 有可用的 MongoDB。它最终会连接,对于每个数据库,它会应用 Block 并打印出数据库名称,最后它会调用回调信号它已完成。

关于MongoDB:ReadPreferenceServerSelector 未选择服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718933/

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